mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-06 17:26:01 +02:00
Bug 491957. Preferences & save action for choosing const alignment
Conflicts: core/org.eclipse.cdt.core/META-INF/MANIFEST.MF core/org.eclipse.cdt.core/pom.xml core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java core/org.eclipse.cdt.ui/pom.xml Change-Id: I061fa28d2e0b37f6d00232ad619f23b892e13ce6 Signed-off-by: Mario Meili <mmeili@hsr.ch> Signed-off-by: Benny Gaechter <benny.gaechter@hsr.ch> Signed-off-by: Felix Morgner <fmorgner@hsr.ch>
This commit is contained in:
parent
619da2a170
commit
ca1ab7f52d
39 changed files with 821 additions and 25 deletions
|
@ -73,7 +73,7 @@ public class ASTWriter {
|
|||
*/
|
||||
public String write(IASTNode rootNode, NodeCommentMap commentMap) throws ProblemRuntimeException {
|
||||
ChangeGeneratorWriterVisitor writer = new ChangeGeneratorWriterVisitor(
|
||||
modificationStore, null, commentMap);
|
||||
modificationStore, null, commentMap, ConstPlacement.placeConstRight(rootNode));
|
||||
if (rootNode != null) {
|
||||
rootNode.accept(writer);
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDecltypeSpecifier;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.cdt.core.parser.Keywords;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.ASTLiteralNode;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
|
||||
|
@ -93,6 +94,15 @@ public class ASTWriterVisitor extends ASTVisitor {
|
|||
this(new NodeCommentMap());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a writer with an empty comment map that uses const placement
|
||||
* properties of the project associated with the provided translation unit.
|
||||
*/
|
||||
public ASTWriterVisitor(ITranslationUnit tu) {
|
||||
this();
|
||||
configureForTU(tu);
|
||||
}
|
||||
|
||||
public ASTWriterVisitor(NodeCommentMap commentMap) {
|
||||
super();
|
||||
init(commentMap);
|
||||
|
@ -114,6 +124,11 @@ public class ASTWriterVisitor extends ASTVisitor {
|
|||
attributeWriter = new AttributeWriter(scribe, this, commentMap);
|
||||
}
|
||||
|
||||
public void configureForTU(ITranslationUnit tu) {
|
||||
boolean placeConstRight = ConstPlacement.placeConstRight(tu);
|
||||
declSpecWriter.setPlaceConstRight(placeConstRight);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return scribe.toString();
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2017 Institute for Software, HSR Hochschule fuer Technik
|
||||
* Rapperswil, University of applied sciences and others
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.rewrite.astwriter;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePreferenceConstants;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
|
||||
public class ConstPlacement {
|
||||
public static boolean placeConstRight(IASTNode node) {
|
||||
if (node == null) {
|
||||
return false;
|
||||
}
|
||||
IASTTranslationUnit translationUnit = node.getTranslationUnit();
|
||||
if (translationUnit == null) {
|
||||
return false;
|
||||
}
|
||||
ITranslationUnit originatingTU = translationUnit.getOriginatingTranslationUnit();
|
||||
return placeConstRight(originatingTU);
|
||||
}
|
||||
|
||||
public static boolean placeConstRight(ITranslationUnit tu) {
|
||||
IProject project = null;
|
||||
if (tu != null) {
|
||||
ICProject cProject = tu.getCProject();
|
||||
if (cProject != null) {
|
||||
project = cProject.getProject();
|
||||
}
|
||||
}
|
||||
return placeConstRight(project);
|
||||
}
|
||||
|
||||
public static boolean placeConstRight(IProject project) {
|
||||
return CCorePreferenceConstants.getPreference(
|
||||
CCorePreferenceConstants.PLACE_CONST_RIGHT_OF_TYPE, project,
|
||||
CCorePreferenceConstants.DEFAULT_PLACE_CONST_RIGHT_OF_TYPE);
|
||||
}
|
||||
}
|
|
@ -50,19 +50,27 @@ import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
|
|||
* @author Emanuel Graf IFS
|
||||
*/
|
||||
public class DeclSpecWriter extends NodeWriter {
|
||||
private boolean constRight = false;
|
||||
|
||||
public DeclSpecWriter(Scribe scribe, ASTWriterVisitor visitor, NodeCommentMap commentMap) {
|
||||
super(scribe, visitor, commentMap);
|
||||
}
|
||||
|
||||
public void setPlaceConstRight(boolean placeConstRight) {
|
||||
constRight = placeConstRight;
|
||||
}
|
||||
|
||||
protected void writeDelcSpec(IASTDeclSpecifier declSpec) {
|
||||
// Write general DelcSpec Keywords
|
||||
writeDeclSpec(declSpec);
|
||||
writeDeclSpec(declSpec, !constRight);
|
||||
if (declSpec instanceof ICPPASTDeclSpecifier) {
|
||||
writeCPPDeclSpec((ICPPASTDeclSpecifier) declSpec);
|
||||
} else if (declSpec instanceof ICASTDeclSpecifier) {
|
||||
writeCDeclSpec((ICASTDeclSpecifier) declSpec);
|
||||
}
|
||||
if(constRight && declSpec.isConst()) {
|
||||
scribe.printSpace();
|
||||
scribe.printStringSpace(Keywords.CONST);
|
||||
}
|
||||
}
|
||||
|
||||
private String getCPPSimpleDecSpecifier(ICPPASTSimpleDeclSpecifier simpDeclSpec) {
|
||||
|
@ -343,7 +351,7 @@ public class DeclSpecWriter extends NodeWriter {
|
|||
}
|
||||
}
|
||||
|
||||
private void writeDeclSpec(IASTDeclSpecifier declSpec) {
|
||||
private void writeDeclSpec(IASTDeclSpecifier declSpec, boolean constEnabled) {
|
||||
if (declSpec.isInline()) {
|
||||
scribe.printStringSpace(Keywords.INLINE);
|
||||
}
|
||||
|
@ -364,7 +372,7 @@ public class DeclSpecWriter extends NodeWriter {
|
|||
scribe.printStringSpace(Keywords.REGISTER);
|
||||
break;
|
||||
}
|
||||
if (declSpec.isConst()) {
|
||||
if (declSpec.isConst() && constEnabled) {
|
||||
scribe.printStringSpace(Keywords.CONST);
|
||||
}
|
||||
if (declSpec.isVolatile()) {
|
||||
|
|
|
@ -51,6 +51,7 @@ import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationMap;
|
|||
import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.ASTRewriteAnalyzer;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ASTWriter;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ConstPlacement;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ContainerNode;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ProblemRuntimeException;
|
||||
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
|
||||
|
@ -340,8 +341,7 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
List<ASTModification> modifications = getModifications(anchorNode, ModificationKind.INSERT_BEFORE);
|
||||
if (modifications.isEmpty())
|
||||
return;
|
||||
ChangeGeneratorWriterVisitor writer =
|
||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
||||
ChangeGeneratorWriterVisitor writer = createChangeWriterForNode(anchorNode);
|
||||
IASTNode newNode = null;
|
||||
for (ASTModification modification : modifications) {
|
||||
boolean first = newNode == null;
|
||||
|
@ -384,8 +384,7 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
private void handleReplace(IASTNode node) {
|
||||
List<ASTModification> modifications = getModifications(node, ModificationKind.REPLACE);
|
||||
String source = node.getTranslationUnit().getRawSignature();
|
||||
ChangeGeneratorWriterVisitor writer =
|
||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
||||
ChangeGeneratorWriterVisitor writer = createChangeWriterForNode(node);
|
||||
IASTFileLocation fileLocation = node.getFileLocation();
|
||||
addToRootEdit(node);
|
||||
if (modifications.size() == 1 && modifications.get(0).getNewNode() == null) {
|
||||
|
@ -443,8 +442,7 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
List<ASTModification> modifications = getModifications(node, ModificationKind.APPEND_CHILD);
|
||||
if (modifications.isEmpty())
|
||||
return;
|
||||
ChangeGeneratorWriterVisitor writer =
|
||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
||||
ChangeGeneratorWriterVisitor writer = createChangeWriterForNode(node);
|
||||
ReplaceEdit anchor = getAppendAnchor(node);
|
||||
Assert.isNotNull(anchor);
|
||||
IASTNode precedingNode = getLastNodeBeforeAppendPoint(node);
|
||||
|
@ -491,8 +489,7 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
int endOffset = skipTrailingBlankLines(source, offset);
|
||||
|
||||
addToRootEdit(node);
|
||||
ChangeGeneratorWriterVisitor writer =
|
||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
||||
ChangeGeneratorWriterVisitor writer = createChangeWriterForNode(node);
|
||||
IASTNode newNode = null;
|
||||
for (ASTModification modification : modifications) {
|
||||
boolean first = newNode == null;
|
||||
|
@ -525,6 +522,10 @@ public class ChangeGenerator extends ASTVisitor {
|
|||
addChildEdit(new DeleteEdit(offset, endOffset - offset));
|
||||
}
|
||||
|
||||
private ChangeGeneratorWriterVisitor createChangeWriterForNode(IASTNode node) {
|
||||
return new ChangeGeneratorWriterVisitor(modificationStore, commentMap, ConstPlacement.placeConstRight(node));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of nodes the given node is part of, for example function parameters if
|
||||
* the node is a parameter.
|
||||
|
|
|
@ -50,7 +50,7 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
|
|||
private ModificationScopeStack stack;
|
||||
|
||||
public ChangeGeneratorWriterVisitor(ASTVisitor delegateVisitor,
|
||||
ASTModificationStore modificationStore, String fileScope, NodeCommentMap commentMap) {
|
||||
ASTModificationStore modificationStore, String fileScope, NodeCommentMap commentMap, boolean placeConstRight) {
|
||||
super(commentMap);
|
||||
|
||||
this.modificationStore = modificationStore;
|
||||
|
@ -76,11 +76,21 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
|
|||
}
|
||||
|
||||
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, NodeCommentMap nodeMap) {
|
||||
this(modStore, null, nodeMap);
|
||||
this(modStore, null, nodeMap, false);
|
||||
}
|
||||
|
||||
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, NodeCommentMap nodeMap,
|
||||
boolean placeConstRight) {
|
||||
this(modStore, null, nodeMap, placeConstRight);
|
||||
}
|
||||
|
||||
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, String fileScope,
|
||||
NodeCommentMap commentMap) {
|
||||
this(modStore, fileScope, commentMap, false);
|
||||
}
|
||||
|
||||
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, String fileScope,
|
||||
NodeCommentMap commentMap, boolean placeConstRight) {
|
||||
super(commentMap);
|
||||
this.modificationStore = modStore;
|
||||
this.fileScope = fileScope;
|
||||
|
@ -89,7 +99,7 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
|
|||
declaratorWriter = new ModifiedASTDeclaratorWriter(scribe, this, stack, commentMap);
|
||||
expWriter = new ModifiedASTExpressionWriter(scribe, this, macroHandler, stack, commentMap);
|
||||
statementWriter = new ModifiedASTStatementWriter(scribe, this, stack, commentMap);
|
||||
declSpecWriter = new ModifiedASTDeclSpecWriter(scribe, this, stack, commentMap);
|
||||
declSpecWriter = new ModifiedASTDeclSpecWriter(scribe, this, stack, commentMap, placeConstRight);
|
||||
declarationWriter = new ModifiedASTDeclarationWriter(scribe, this, stack, commentMap);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,8 +22,9 @@ public class ModifiedASTDeclSpecWriter extends DeclSpecWriter {
|
|||
private final ASTModificationHelper modificationHelper;
|
||||
|
||||
public ModifiedASTDeclSpecWriter(Scribe scribe, ASTWriterVisitor visitor,
|
||||
ModificationScopeStack stack, NodeCommentMap commentMap) {
|
||||
ModificationScopeStack stack, NodeCommentMap commentMap, boolean placeConstRight) {
|
||||
super(scribe, visitor, commentMap);
|
||||
setPlaceConstRight(placeConstRight);
|
||||
this.modificationHelper = new ASTModificationHelper(stack);
|
||||
}
|
||||
|
||||
|
|
|
@ -349,6 +349,21 @@ public class CCorePreferenceConstants {
|
|||
// NOTE: This default came from measurements using a 1Gb heap on a 64-bit VM. The test project was
|
||||
// boost-1.55.0. This default will index all but 9 files without running out of memory.
|
||||
|
||||
/**
|
||||
* A named preference that specifies whether the const qualifier is written to the right (or left) of
|
||||
* the type in a declaration specifier.
|
||||
*
|
||||
* @since 6.3
|
||||
*/
|
||||
public static final String PLACE_CONST_RIGHT_OF_TYPE = "astwriter.placeConstRightOfType"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Default value for {@link #PLACE_CONST_RIGHT_OF_TYPE}.
|
||||
*
|
||||
* @since 6.3
|
||||
*/
|
||||
public static final boolean DEFAULT_PLACE_CONST_RIGHT_OF_TYPE = false;
|
||||
|
||||
/**
|
||||
* Returns the node in the preference in the given context.
|
||||
*
|
||||
|
|
|
@ -75,5 +75,6 @@ public class CCorePreferenceInitializer extends AbstractPreferenceInitializer {
|
|||
defaultPreferences.putInt(CCorePreferenceConstants.SCALABILITY_MAXIMUM_TRIVIAL_EXPRESSIONS, CCorePreferenceConstants.DEFAULT_SCALABILITY_MAXIMUM_TRIVIAL_EXPRESSIONS);
|
||||
defaultPreferences.putBoolean(CCorePreferenceConstants.SCALABILITY_LIMIT_TOKENS_PER_TU, CCorePreferenceConstants.DEFAULT_SCALABILITY_LIMIT_TOKENS_PER_TU);
|
||||
defaultPreferences.putInt(CCorePreferenceConstants.SCALABILITY_MAXIMUM_TOKENS, CCorePreferenceConstants.DEFAULT_SCALABILITY_MAXIMUM_TOKENS);
|
||||
defaultPreferences.putBoolean(CCorePreferenceConstants.PLACE_CONST_RIGHT_OF_TYPE, CCorePreferenceConstants.DEFAULT_PLACE_CONST_RIGHT_OF_TYPE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
|
||||
void f(const int * const);
|
||||
|
||||
void f(const int * const) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
const int &dsa { 2 };
|
||||
|
||||
const int j { 8 };
|
||||
|
||||
const int * const klz;
|
||||
|
||||
const int l { 2 };
|
||||
|
||||
bool yes = false;
|
||||
|
||||
const int k { 42 };
|
||||
|
||||
const volatile int q = 1;
|
||||
|
||||
volatile const int r = 99;
|
||||
|
||||
using const_int = int;
|
||||
const const_int s = 7;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
|
||||
void f(int const * const);
|
||||
|
||||
void f(int const * const) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
int const &dsa { 2 };
|
||||
|
||||
int const j { 8 };
|
||||
|
||||
int const * const klz;
|
||||
|
||||
int const l { 2 };
|
||||
|
||||
bool yes = false;
|
||||
|
||||
int const k { 42 };
|
||||
|
||||
volatile int
|
||||
const q = 1;
|
||||
|
||||
volatile const int r = 99;
|
||||
|
||||
using const_int = int;
|
||||
const_int const s = 7;
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
|
||||
void f(const int * const);
|
||||
|
||||
void f(const int * const) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
const int &dsa { 2 };
|
||||
|
||||
const int j { 8 };
|
||||
|
||||
const int * const klz;
|
||||
|
||||
const int l { 2 };
|
||||
|
||||
bool yes = false;
|
||||
|
||||
const int k { 42 };
|
||||
|
||||
volatile const
|
||||
int q = 1;
|
||||
|
||||
using int_const = int;
|
||||
const int_const r = 7;
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
|
||||
void f(const int * const);
|
||||
|
||||
void f(const int * const) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
const int &dsa { 2 };
|
||||
|
||||
const int j { 8 };
|
||||
|
||||
const int * const klz;
|
||||
|
||||
const int l { 2 };
|
||||
|
||||
bool yes = false;
|
||||
|
||||
const int k { 42 };
|
||||
|
||||
volatile const
|
||||
int q = 1;
|
||||
|
||||
using int_const = int;
|
||||
const int_const r = 7;
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
void f(int const * const);
|
||||
|
||||
void f(int const * const) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
int const &dsa { 2 };
|
||||
|
||||
int const j { 8 };
|
||||
|
||||
int const * const klz;
|
||||
|
||||
int const l { 2 };
|
||||
|
||||
bool yes = false;
|
||||
|
||||
int const k { 42 };
|
||||
|
||||
volatile int const q = 1;
|
||||
|
||||
using int_const = int;
|
||||
int_const const r = 7;
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
|
||||
void f(const int * const);
|
||||
|
||||
void f(const int * const) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
const int &dsa { 2 };
|
||||
|
||||
const int j { 8 };
|
||||
|
||||
const int * const klz;
|
||||
|
||||
const int l { 2 };
|
||||
|
||||
bool yes = false;
|
||||
|
||||
const int k { 42 };
|
||||
|
||||
volatile const
|
||||
int q = 1;
|
||||
|
||||
using int_const = int;
|
||||
const int_const r = 7;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
|
||||
void f(int const * const);
|
||||
|
||||
void f(int const * const) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
int const &dsa { 2 };
|
||||
|
||||
int const j { 8 };
|
||||
|
||||
int const * const klz;
|
||||
|
||||
int const l { 2 };
|
||||
|
||||
bool yes = false;
|
||||
|
||||
int const k { 42 };
|
||||
|
||||
int const volatile m = 21;
|
||||
|
||||
using volatile_int = int;
|
||||
volatile_int const volatile v = 89;
|
||||
|
||||
using const_int = int;
|
||||
const_int const w = 73;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
|
||||
void f(int const * const);
|
||||
|
||||
void f(int const * const) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
int const &dsa { 2 };
|
||||
|
||||
int const j { 8 };
|
||||
|
||||
int const * const klz;
|
||||
|
||||
int const l { 2 };
|
||||
|
||||
bool yes = false;
|
||||
|
||||
int const k { 42 };
|
||||
|
||||
int const volatile m = 21;
|
||||
|
||||
using volatile_int = int;
|
||||
volatile_int const volatile v = 89;
|
||||
|
||||
using const_int = int;
|
||||
const_int const w = 73;
|
||||
}
|
|
@ -0,0 +1,130 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2016 Institute for Software, HSR Hochschule fuer Technik
|
||||
* Rapperswil, University of applied sciences.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.ui.tests.text;
|
||||
|
||||
import java.util.ListResourceBundle;
|
||||
|
||||
import org.eclipse.core.runtime.preferences.DefaultScope;
|
||||
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
import org.eclipse.jface.text.source.SourceViewer;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.CCorePreferenceConstants;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||
import org.eclipse.cdt.ui.testplugin.EditorTestHelper;
|
||||
import org.eclipse.cdt.ui.testplugin.ResourceTestHelper;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.actions.AlignConstAction;
|
||||
import org.eclipse.cdt.internal.ui.editor.CEditor;
|
||||
|
||||
import junit.extensions.TestSetup;
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestCase;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
/**
|
||||
* Test for the const alignment action.
|
||||
*/
|
||||
public class AlignConstActionTest extends TestCase {
|
||||
private static final String PROJECT = "AlignConstTests";
|
||||
|
||||
private static final class EmptyBundle extends ListResourceBundle {
|
||||
@Override
|
||||
protected Object[][] getContents() {
|
||||
return new Object[0][];
|
||||
}
|
||||
}
|
||||
|
||||
protected static class AlignConstTestSetup extends TestSetup {
|
||||
private ICProject fCProject;
|
||||
|
||||
public AlignConstTestSetup(Test test) {
|
||||
super(test);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
fCProject = EditorTestHelper.createCProject(PROJECT, "resources/constalign");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
if (fCProject != null)
|
||||
CProjectHelper.delete(fCProject);
|
||||
super.tearDown();
|
||||
}
|
||||
}
|
||||
|
||||
public static Test suite() {
|
||||
return new AlignConstTestSetup(new TestSuite(AlignConstActionTest.class));
|
||||
}
|
||||
|
||||
private CEditor fEditor;
|
||||
private SourceViewer fSourceViewer;
|
||||
private IDocument fDocument;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
IEclipsePreferences prefs = DefaultScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID);
|
||||
prefs.putBoolean(CCorePreferenceConstants.PLACE_CONST_RIGHT_OF_TYPE, getName().startsWith("testRight"));
|
||||
String filename = createFileName("Before");
|
||||
fEditor = (CEditor) EditorTestHelper.openInEditor(ResourceTestHelper.findFile(filename), true);
|
||||
fSourceViewer = EditorTestHelper.getSourceViewer(fEditor);
|
||||
fDocument = fSourceViewer.getDocument();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
EditorTestHelper.closeEditor(fEditor);
|
||||
IEclipsePreferences prefs = DefaultScope.INSTANCE.getNode(CCorePlugin.PLUGIN_ID);
|
||||
prefs.putBoolean(CCorePreferenceConstants.PLACE_CONST_RIGHT_OF_TYPE, false);
|
||||
}
|
||||
|
||||
private void assertAlignConstResult() throws Exception {
|
||||
String afterFile = createFileName("After");
|
||||
String expected = ResourceTestHelper.read(afterFile).toString();
|
||||
|
||||
new AlignConstAction(new EmptyBundle(), "prefix", fEditor).run();
|
||||
|
||||
assertEquals(expected, fDocument.get());
|
||||
}
|
||||
|
||||
private String createFileName(String qualifier) {
|
||||
String name = getName();
|
||||
name = name.substring(4, 5).toLowerCase() + name.substring(5);
|
||||
return "/" + PROJECT + "/src/" + name + "/" + qualifier + ".cpp";
|
||||
}
|
||||
|
||||
private void selectAll() {
|
||||
fSourceViewer.setSelectedRange(0, fDocument.getLength());
|
||||
}
|
||||
|
||||
public void testRightUnchanged() throws Exception {
|
||||
selectAll();
|
||||
assertAlignConstResult();
|
||||
}
|
||||
|
||||
public void testRightChanged() throws Exception {
|
||||
selectAll();
|
||||
assertAlignConstResult();
|
||||
}
|
||||
|
||||
public void testLeftUnchanged() throws Exception {
|
||||
selectAll();
|
||||
assertAlignConstResult();
|
||||
}
|
||||
|
||||
public void testLeftChanged() throws Exception {
|
||||
selectAll();
|
||||
assertAlignConstResult();
|
||||
}
|
||||
}
|
|
@ -31,6 +31,7 @@ import org.eclipse.cdt.ui.tests.text.doctools.DocCommentTestSuite;
|
|||
AsmPartitionerTest.class,
|
||||
|
||||
// smart edit tests
|
||||
AlignConstActionTest.class,
|
||||
CAutoIndentTest.class,
|
||||
CHeuristicScannerTest.class,
|
||||
BracketInserterTest.class,
|
||||
|
|
|
@ -123,6 +123,9 @@ ActionDefinition.removeBlockComment.description= Removes the block comment enclo
|
|||
ActionDefinition.indent.name= Indent Line
|
||||
ActionDefinition.indent.description=Indents the current line
|
||||
|
||||
ActionDefinition.alignConst.name= Align const qualifiers
|
||||
ActionDefinition.alignConst.description= Moves const qualifiers to the left or right of the type depending on the workspace preferences
|
||||
|
||||
ActionDefinition.format.name=Format
|
||||
ActionDefinition.format.description=Formats Source Code
|
||||
|
||||
|
@ -613,6 +616,7 @@ headerFileRenameParticipant.name = Header File Rename
|
|||
|
||||
FormatAction.label= &Format
|
||||
IndentAction.label= Correct &Indentation
|
||||
AlignConst.label= &Align Const
|
||||
OrganizeIncludesAction.label= Or&ganize Includes
|
||||
AddIncludeAction.label= A&dd Include
|
||||
SortLinesAction.label= Sor&t Lines
|
||||
|
|
|
@ -1956,6 +1956,13 @@
|
|||
menubarPath="org.eclipse.jdt.ui.source.menu/editGroup"
|
||||
id="org.eclipse.cdt.ui.actions.Indent">
|
||||
</action>
|
||||
<action
|
||||
definitionId="org.eclipse.cdt.ui.edit.text.c.align.const"
|
||||
label="%AlignConst.label"
|
||||
retarget="true"
|
||||
menubarPath="org.eclipse.jdt.ui.source.menu/editGroup"
|
||||
id="org.eclipse.cdt.ui.actions.AlignConst">
|
||||
</action>
|
||||
<action
|
||||
definitionId="org.eclipse.ui.edit.text.shiftLeft"
|
||||
disabledIcon="icons/dlcl16/shift_l_edit.gif"
|
||||
|
@ -2397,6 +2404,11 @@
|
|||
contextId="org.eclipse.cdt.ui.cEditorScope"
|
||||
commandId="org.eclipse.cdt.ui.edit.text.c.indent"
|
||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
|
||||
<key
|
||||
sequence="M1+M2+A"
|
||||
contextId="org.eclipse.cdt.ui.cEditorScope"
|
||||
commandId="org.eclipse.cdt.ui.edit.text.c.align.const"
|
||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
|
||||
<key
|
||||
sequence="M2+M3+Z"
|
||||
contextId="org.eclipse.cdt.ui.cEditorScope"
|
||||
|
@ -3218,6 +3230,12 @@
|
|||
categoryId="org.eclipse.ui.category.edit"
|
||||
id="org.eclipse.cdt.ui.edit.text.c.select.last">
|
||||
</command>
|
||||
<command
|
||||
categoryId="org.eclipse.cdt.ui.category.source"
|
||||
description="%ActionDefinition.alignConst.description"
|
||||
id="org.eclipse.cdt.ui.edit.text.c.align.const"
|
||||
name="%ActionDefinition.alignConst.name">
|
||||
</command>
|
||||
</extension>
|
||||
<extension
|
||||
id="pdomSearchPage"
|
||||
|
@ -4935,6 +4953,9 @@
|
|||
<key name="markOverloadedOperatorsOccurrences"/>
|
||||
<key name="scalability." match="prefix"/>
|
||||
<key name="content_assist_proposals_timeout"/>
|
||||
<key
|
||||
name="alignConst">
|
||||
</key>
|
||||
</entry>
|
||||
</mapping>
|
||||
<description>
|
||||
|
@ -4958,6 +4979,12 @@
|
|||
<key name="nameStyle." match="prefix"/>
|
||||
<key name="organizeIncludes." match="prefix"/>
|
||||
</entry>
|
||||
<entry
|
||||
node="org.eclipse.cdt.core">
|
||||
<key
|
||||
name="astwriter.placeConstRightOfType">
|
||||
</key>
|
||||
</entry>
|
||||
</mapping>
|
||||
<description>
|
||||
%transfer.CodeStyle.description
|
||||
|
|
|
@ -93,6 +93,9 @@ public class ActionMessages extends NLS {
|
|||
public static String FormatAllAction_failedvalidateedit_message;
|
||||
public static String FormatAllAction_noundo_title;
|
||||
public static String FormatAllAction_noundo_message;
|
||||
public static String AlignAllConstAction_label;
|
||||
public static String AlignAllConstAction_tooltip;
|
||||
public static String AlignAllConstAction_description;
|
||||
public static String CollapseAllAction_label;
|
||||
public static String CollapseAllAction_tooltip;
|
||||
public static String CollapseAllAction_description;
|
||||
|
|
|
@ -113,6 +113,10 @@ FormatAllAction_failedvalidateedit_message=Problems while accessing selected fil
|
|||
FormatAllAction_noundo_title=Format
|
||||
FormatAllAction_noundo_message='Undo' is not supported by this operation. Do you want to continue?
|
||||
|
||||
AlignAllConstAction_label=Align const
|
||||
AlignAllConstAction_tooltip=Align all const qualifiers
|
||||
AlignAllConstAction_description=Aligns all const qualifiers relative to the corresponding type
|
||||
|
||||
CollapseAllAction_label=Collapse All
|
||||
CollapseAllAction_tooltip=Collapse All
|
||||
CollapseAllAction_description=Collapse All
|
||||
|
|
|
@ -0,0 +1,180 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2016 Institute for Software, HSR Hochschule fuer Technik
|
||||
* Rapperswil, University of applied sciences.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.actions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||
import org.eclipse.jface.text.ITextSelection;
|
||||
import org.eclipse.jface.text.TextSelection;
|
||||
import org.eclipse.jface.viewers.ISelection;
|
||||
import org.eclipse.jface.viewers.ISelectionProvider;
|
||||
import org.eclipse.ui.texteditor.ITextEditor;
|
||||
import org.eclipse.ui.texteditor.TextEditorAction;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePreferenceConstants;
|
||||
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
import org.eclipse.cdt.core.dom.rewrite.ASTRewrite;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.cdt.core.parser.Keywords;
|
||||
import org.eclipse.cdt.ui.CDTUITools;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.refactoring.utils.IdentifierHelper;
|
||||
|
||||
public class AlignConstAction extends TextEditorAction {
|
||||
|
||||
private static class MisalignedConstFinderVisitor extends ASTVisitor {
|
||||
private final boolean expectConstRight;
|
||||
private final List<IASTDeclSpecifier> declSpecifiersWithMisalignedConst = new ArrayList<>();
|
||||
{
|
||||
shouldVisitDeclSpecifiers = true;
|
||||
}
|
||||
|
||||
public MisalignedConstFinderVisitor(boolean expectConstRight) {
|
||||
this.expectConstRight = expectConstRight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int visit(IASTDeclSpecifier declSpec) {
|
||||
if (declSpec.isConst()) {
|
||||
String rawSignature = declSpec.getRawSignature();
|
||||
rawSignature = rawSignature.replace(Keywords.VOLATILE, "").trim(); //$NON-NLS-1$
|
||||
if (!expectConstRight && !startsWithConst(rawSignature)) {
|
||||
declSpecifiersWithMisalignedConst.add(declSpec);
|
||||
} else if (expectConstRight && !endsWithConst(rawSignature)) {
|
||||
declSpecifiersWithMisalignedConst.add(declSpec);
|
||||
}
|
||||
}
|
||||
return PROCESS_CONTINUE;
|
||||
}
|
||||
|
||||
private boolean startsWithConst(String signature) {
|
||||
if (!signature.startsWith(Keywords.CONST)) {
|
||||
return false;
|
||||
}
|
||||
String candidate = signature.substring(0, Keywords.CONST.length() + 1);
|
||||
return !IdentifierHelper.checkIdentifierName(candidate).isCorrect();
|
||||
}
|
||||
|
||||
private boolean endsWithConst(String signature) {
|
||||
if (!signature.endsWith(Keywords.CONST)) {
|
||||
return false;
|
||||
}
|
||||
String candidate = signature.substring(signature.length() - Keywords.CONST.length() - 1);
|
||||
return !IdentifierHelper.checkIdentifierName(candidate).isCorrect();
|
||||
}
|
||||
|
||||
public List<IASTDeclSpecifier> getDeclSpecifiersWithMisaligedConst() {
|
||||
return declSpecifiersWithMisalignedConst;
|
||||
}
|
||||
}
|
||||
|
||||
private static List<IASTDeclSpecifier> findMisalignedConsts(IASTNode rootNode, ICProject cProject) {
|
||||
boolean expectConstRight = CCorePreferenceConstants.getPreference(
|
||||
CCorePreferenceConstants.PLACE_CONST_RIGHT_OF_TYPE, cProject,
|
||||
CCorePreferenceConstants.DEFAULT_PLACE_CONST_RIGHT_OF_TYPE);
|
||||
MisalignedConstFinderVisitor misalignedConstVisitor = new MisalignedConstFinderVisitor(
|
||||
expectConstRight);
|
||||
rootNode.accept(misalignedConstVisitor);
|
||||
return misalignedConstVisitor.getDeclSpecifiersWithMisaligedConst();
|
||||
}
|
||||
|
||||
public static void rewriteMisalignedConstSpecifiers(IASTNode node, IProgressMonitor monitor)
|
||||
throws CoreException {
|
||||
ICProject cProject = node.getTranslationUnit().getOriginatingTranslationUnit().getCProject();
|
||||
List<IASTDeclSpecifier> misalignedSpecifiers = findMisalignedConsts(node, cProject);
|
||||
if (!misalignedSpecifiers.isEmpty()) {
|
||||
IASTTranslationUnit ast = node.getTranslationUnit();
|
||||
ASTRewrite rewrite = ASTRewrite.create(ast);
|
||||
for (IASTDeclSpecifier spec : misalignedSpecifiers) {
|
||||
rewrite.replace(spec, spec, null);
|
||||
}
|
||||
rewrite.rewriteAST().perform(monitor);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new AlignConstAction instance.
|
||||
*
|
||||
* @param bundle
|
||||
* the resource bundle
|
||||
* @param prefix
|
||||
* the prefix to use for keys in <code>bundle</code>
|
||||
* @param editor
|
||||
* the text editor
|
||||
*/
|
||||
public AlignConstAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
|
||||
super(bundle, prefix, editor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
ITextSelection textSelection = getSelection();
|
||||
if (textSelection.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
final int offset = textSelection.getOffset();
|
||||
final int length = textSelection.getLength();
|
||||
ITextEditor activeEditor = getTextEditor();
|
||||
|
||||
alignConstQualifiers(offset, length, activeEditor);
|
||||
}
|
||||
|
||||
private void alignConstQualifiers(final int offset, final int length, ITextEditor activeEditor) {
|
||||
ITranslationUnit translationUnit = (ITranslationUnit) CDTUITools
|
||||
.getEditorInputCElement(activeEditor.getEditorInput());
|
||||
|
||||
try {
|
||||
IASTTranslationUnit ast = translationUnit.getAST(null, ITranslationUnit.AST_SKIP_ALL_HEADERS);
|
||||
IASTNode enclosingNode = ast.getNodeSelector(null).findEnclosingNode(offset, length);
|
||||
rewriteMisalignedConstSpecifiers(enclosingNode, new NullProgressMonitor());
|
||||
} catch (CoreException e) {
|
||||
CUIPlugin.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the selection in the editor or an invalid selection if none can
|
||||
* be obtained. Never returns <code>null</code>.
|
||||
*
|
||||
* @return the current selection, never <code>null</code>
|
||||
*/
|
||||
private ITextSelection getSelection() {
|
||||
ISelectionProvider provider = getSelectionProvider();
|
||||
if (provider != null) {
|
||||
ISelection selection = provider.getSelection();
|
||||
if (selection instanceof ITextSelection)
|
||||
return (ITextSelection) selection;
|
||||
}
|
||||
|
||||
return TextSelection.emptySelection();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the editor's selection provider.
|
||||
*
|
||||
* @return the editor's selection provider or <code>null</code>
|
||||
*/
|
||||
private ISelectionProvider getSelectionProvider() {
|
||||
ITextEditor editor = getTextEditor();
|
||||
if (editor != null) {
|
||||
return editor.getSelectionProvider();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -89,6 +89,7 @@ import org.eclipse.cdt.ui.text.ICPartitions;
|
|||
|
||||
import org.eclipse.cdt.internal.core.model.TranslationUnit;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.saveactions.AlignConstSaveAction;
|
||||
import org.eclipse.cdt.internal.ui.text.IProblemRequestorExtension;
|
||||
import org.eclipse.cdt.internal.ui.text.spelling.CoreSpellingProblem;
|
||||
import org.eclipse.cdt.internal.ui.util.EditorUtility;
|
||||
|
@ -964,8 +965,8 @@ public class CDocumentProvider extends TextFileDocumentProvider {
|
|||
*/
|
||||
private void performSaveActions(ITranslationUnit tu, ITextFileBuffer buffer, IProgressMonitor monitor)
|
||||
throws CoreException {
|
||||
if (shouldRemoveTrailingWhitespace() || shouldAddNewlineAtEof() || shouldFormatCode()) {
|
||||
SubMonitor progress = SubMonitor.convert(monitor, 2);
|
||||
if (shouldRemoveTrailingWhitespace() || shouldAddNewlineAtEof() || shouldFormatCode() || shouldAlignAllConst()) {
|
||||
SubMonitor progress = SubMonitor.convert(monitor, 3);
|
||||
IDocumentUndoManager undoManager= null;
|
||||
IRegion[] changedRegions= needsChangedRegions() ?
|
||||
EditorUtility.calculateChangedLineRegions(buffer, progress.split(1)) : null;
|
||||
|
@ -992,6 +993,11 @@ public class CDocumentProvider extends TextFileDocumentProvider {
|
|||
}
|
||||
edit.apply(document);
|
||||
}
|
||||
|
||||
if (shouldAlignAllConst()) {
|
||||
new AlignConstSaveAction().perform(tu, progress.split(1));
|
||||
}
|
||||
|
||||
} catch (MalformedTreeException | BadLocationException e) {
|
||||
String message= e.getMessage();
|
||||
if (message == null)
|
||||
|
@ -1028,6 +1034,11 @@ public class CDocumentProvider extends TextFileDocumentProvider {
|
|||
PreferenceConstants.REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES);
|
||||
}
|
||||
|
||||
private static boolean shouldAlignAllConst() {
|
||||
return PreferenceConstants.getPreferenceStore().getBoolean(
|
||||
PreferenceConstants.ALIGN_ALL_CONST);
|
||||
}
|
||||
|
||||
private static boolean needsChangedRegions() {
|
||||
return shouldRemoveTrailingWhitespace() && isLimitedRemoveTrailingWhitespace()
|
||||
|| shouldFormatCode() && isLimitedFormatCode();
|
||||
|
|
|
@ -212,6 +212,7 @@ import org.eclipse.cdt.internal.ui.CPluginImages;
|
|||
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
|
||||
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
|
||||
import org.eclipse.cdt.internal.ui.actions.AddBlockCommentAction;
|
||||
import org.eclipse.cdt.internal.ui.actions.AlignConstAction;
|
||||
import org.eclipse.cdt.internal.ui.actions.FindWordAction;
|
||||
import org.eclipse.cdt.internal.ui.actions.FoldingActionGroup;
|
||||
import org.eclipse.cdt.internal.ui.actions.GoToNextPreviousMemberAction;
|
||||
|
@ -2284,6 +2285,12 @@ public class CEditor extends TextEditor implements ICEditor, ISelectionChangedLi
|
|||
markAsSelectionDependentAction("Indent", true); //$NON-NLS-1$
|
||||
// PlatformUI.getWorkbench().getHelpSystem().setHelp(action, ICHelpContextIds.INDENT_ACTION);
|
||||
|
||||
action = new AlignConstAction(bundle, "AlignConst.", this); //$NON-NLS-1$
|
||||
action.setActionDefinitionId(ICEditorActionDefinitionIds.ALIGN_CONST);
|
||||
setAction("AlignConst", action); //$NON-NLS-1$
|
||||
markAsStateDependentAction("AlignConst", true); //$NON-NLS-1$
|
||||
markAsSelectionDependentAction("AlignConst", true); //$NON-NLS-1$
|
||||
|
||||
action = new IndentAction(bundle, "Indent.", this, true); //$NON-NLS-1$
|
||||
setAction("IndentOnTab", action); //$NON-NLS-1$
|
||||
markAsStateDependentAction("IndentOnTab", true); //$NON-NLS-1$
|
||||
|
|
|
@ -225,6 +225,7 @@ public class CEditorActionContributor extends TextEditorActionContributor {
|
|||
bars.setGlobalActionHandler(CdtActionConstants.ADD_BLOCK_COMMENT, getAction(textEditor, "AddBlockComment")); //$NON-NLS-1$
|
||||
bars.setGlobalActionHandler(CdtActionConstants.REMOVE_BLOCK_COMMENT, getAction(textEditor, "RemoveBlockComment")); //$NON-NLS-1$
|
||||
bars.setGlobalActionHandler(CdtActionConstants.INDENT, getAction(textEditor, "Indent")); //$NON-NLS-1$
|
||||
bars.setGlobalActionHandler(CdtActionConstants.ALIGN_CONST, getAction(textEditor, "AlignConst")); //$NON-NLS-1$
|
||||
bars.setGlobalActionHandler(CdtActionConstants.ADD_INCLUDE, getAction(textEditor, "AddInclude")); //$NON-NLS-1$
|
||||
bars.setGlobalActionHandler(CdtActionConstants.ORGANIZE_INCLUDES, getAction(textEditor, "OrganizeIncludes")); //$NON-NLS-1$
|
||||
bars.setGlobalActionHandler(CdtActionConstants.SORT_LINES, getAction(textEditor, "SortLines")); //$NON-NLS-1$
|
||||
|
|
|
@ -89,6 +89,10 @@ Indent.label=Correct &Indentation
|
|||
Indent.tooltip=&Indent Current Line to Correct Indentation
|
||||
Indent.description=&Indents the current line or selection depending on surrounding source code
|
||||
|
||||
AlignConst.label=&Align const
|
||||
AlignConst.tooltip=&Align const qualifier according to preferences
|
||||
AlignConst.description=&Aligns const qualified according to preferences
|
||||
|
||||
GotoNextMember.label= N&ext Member
|
||||
GotoNextMember.tooltip=Move the Caret to the Next Member of the Translation Unit
|
||||
GotoNextMember.description=Moves the caret to the next member of the translation unit
|
||||
|
|
|
@ -60,6 +60,12 @@ public interface ICEditorActionDefinitionIds extends ITextEditorActionDefinition
|
|||
*/
|
||||
public static final String INDENT = "org.eclipse.cdt.ui.edit.text.c.indent"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Action definition ID of the source -> align const action
|
||||
* (value <code>"org.eclipse.cdt.ui.edit.text.c.align.const"</code>).
|
||||
*/
|
||||
public static final String ALIGN_CONST = "org.eclipse.cdt.ui.edit.text.c.align.const"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Action definition ID of the source -> format action
|
||||
* (value <code>"org.eclipse.cdt.ui.edit.text.c.format"</code>).
|
||||
|
|
|
@ -18,6 +18,8 @@ import org.eclipse.swt.widgets.Composite;
|
|||
import org.eclipse.swt.widgets.Control;
|
||||
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.CCorePreferenceConstants;
|
||||
import org.eclipse.cdt.ui.PreferenceConstants;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
|
||||
|
@ -32,12 +34,15 @@ class CodeStyleBlock extends OptionsConfigurationBlock {
|
|||
getCDTUIKey(PreferenceConstants.FUNCTION_OUTPUT_PARAMETERS_BEFORE_INPUT);
|
||||
private static final Key FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER =
|
||||
getCDTUIKey(PreferenceConstants.FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER);
|
||||
private static final Key PLACE_CONST_RIGHT_OF_TYPE =
|
||||
getKey(CCorePlugin.PLUGIN_ID, CCorePreferenceConstants.PLACE_CONST_RIGHT_OF_TYPE);
|
||||
|
||||
private static Key[] getAllKeys() {
|
||||
return new Key[] {
|
||||
CLASS_MEMBER_ASCENDING_VISIBILITY_ORDER,
|
||||
FUNCTION_OUTPUT_PARAMETERS_BEFORE_INPUT,
|
||||
FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER,
|
||||
PLACE_CONST_RIGHT_OF_TYPE,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -65,6 +70,9 @@ class CodeStyleBlock extends OptionsConfigurationBlock {
|
|||
composite = addSubsection(control, PreferencesMessages.CodeStyleBlock_function_output_parameter_style);
|
||||
fillFunctionOutputParameterStyleSection(composite);
|
||||
|
||||
composite = addSubsection(control, PreferencesMessages.CodeStyleBlock_const_keyword_placement);
|
||||
fillConstPlacementsSections(composite);
|
||||
|
||||
scrolled.setContent(control);
|
||||
final Point size= control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
|
||||
scrolled.setMinSize(size.x, size.y);
|
||||
|
@ -104,6 +112,17 @@ class CodeStyleBlock extends OptionsConfigurationBlock {
|
|||
FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER, TRUE_FALSE, 0);
|
||||
}
|
||||
|
||||
private void fillConstPlacementsSections(Composite composite) {
|
||||
GridLayout layout= new GridLayout();
|
||||
layout.numColumns= 3;
|
||||
composite.setLayout(layout);
|
||||
|
||||
addRadioButton(composite, PreferencesMessages.CodeStyleBlock_const_left,
|
||||
PLACE_CONST_RIGHT_OF_TYPE, FALSE_TRUE, 0);
|
||||
addRadioButton(composite, PreferencesMessages.CodeStyleBlock_const_right,
|
||||
PLACE_CONST_RIGHT_OF_TYPE, TRUE_FALSE, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void validateSettings(Key changedKey, String oldValue, String newValue) {
|
||||
}
|
||||
|
|
|
@ -190,6 +190,7 @@ public final class PreferencesMessages extends NLS {
|
|||
public static String SaveActionsPreferencePage_inAllLines;
|
||||
public static String SaveActionsPreferencePage_inEditedLines;
|
||||
public static String SaveActionsPreferencePage_ensureNewline;
|
||||
public static String SaveActionsPreferencePage_alignConst;
|
||||
|
||||
public static String SmartTypingConfigurationBlock_autoclose_title;
|
||||
public static String SmartTypingConfigurationBlock_autoindent_newlines;
|
||||
|
@ -217,6 +218,9 @@ public final class PreferencesMessages extends NLS {
|
|||
public static String CodeStyleBlock_function_output_parameter_style;
|
||||
public static String CodeStyleBlock_pass_by_reference;
|
||||
public static String CodeStyleBlock_pass_by_pointer;
|
||||
public static String CodeStyleBlock_const_keyword_placement;
|
||||
public static String CodeStyleBlock_const_left;
|
||||
public static String CodeStyleBlock_const_right;
|
||||
|
||||
public static String TodoTaskPreferencePage_title;
|
||||
public static String TodoTaskPreferencePage_description;
|
||||
|
|
|
@ -120,6 +120,7 @@ SaveActionsPreferencePage_removeTrailingWhitespace=Remove trailing &whitespace
|
|||
SaveActionsPreferencePage_inAllLines=In all line&s
|
||||
SaveActionsPreferencePage_inEditedLines=In edi&ted lines
|
||||
SaveActionsPreferencePage_ensureNewline=Ensure &newline at the end of file
|
||||
SaveActionsPreferencePage_alignConst=Align Const
|
||||
|
||||
TemplatePreferencePage_Viewer_preview=Preview:
|
||||
|
||||
|
@ -252,6 +253,9 @@ CodeStyleBlock_output_input=&Output parameters first
|
|||
CodeStyleBlock_function_output_parameter_style=Output parameters of C++ functions:
|
||||
CodeStyleBlock_pass_by_reference=Pass by &reference
|
||||
CodeStyleBlock_pass_by_pointer=Pass by poi&nter
|
||||
CodeStyleBlock_const_keyword_placement=Placement of the const keyword:
|
||||
CodeStyleBlock_const_left=&Left of type e.g. "const int n{};"
|
||||
CodeStyleBlock_const_right=&Right of type e.g. "int const n{};"
|
||||
|
||||
# Task tags.
|
||||
TodoTaskPreferencePage_title=Task Tags
|
||||
|
|
|
@ -16,6 +16,7 @@ import static org.eclipse.cdt.ui.PreferenceConstants.FORMAT_SOURCE_CODE;
|
|||
import static org.eclipse.cdt.ui.PreferenceConstants.FORMAT_SOURCE_CODE_LIMIT_TO_EDITED_LINES;
|
||||
import static org.eclipse.cdt.ui.PreferenceConstants.REMOVE_TRAILING_WHITESPACE;
|
||||
import static org.eclipse.cdt.ui.PreferenceConstants.REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES;
|
||||
import static org.eclipse.cdt.ui.PreferenceConstants.ALIGN_ALL_CONST;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
@ -58,6 +59,8 @@ public class SaveActionsPreferencePage extends AbstractPreferencePage {
|
|||
REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES));
|
||||
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN,
|
||||
ENSURE_NEWLINE_AT_EOF));
|
||||
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN,
|
||||
ALIGN_ALL_CONST));
|
||||
|
||||
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
|
||||
overlayKeys.toArray(keys);
|
||||
|
@ -123,6 +126,11 @@ public class SaveActionsPreferencePage extends AbstractPreferencePage {
|
|||
addCheckBox(composite, PreferencesMessages.SaveActionsPreferencePage_ensureNewline,
|
||||
ENSURE_NEWLINE_AT_EOF, 0);
|
||||
|
||||
ControlFactory.createEmptySpace(composite, 1);
|
||||
|
||||
addCheckBox(composite, PreferencesMessages.SaveActionsPreferencePage_alignConst,
|
||||
ALIGN_ALL_CONST, 0);
|
||||
|
||||
return composite;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
import org.eclipse.cdt.core.dom.ast.INodeFactory;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit;
|
||||
|
@ -213,11 +214,12 @@ public class NameInformation {
|
|||
public String getTypeName() {
|
||||
if (newTypeName != null)
|
||||
return newTypeName;
|
||||
INodeFactory nodeFactory = name.getTranslationUnit().getASTNodeFactory();
|
||||
IASTTranslationUnit translationUnit = name.getTranslationUnit();
|
||||
INodeFactory nodeFactory = translationUnit.getASTNodeFactory();
|
||||
IASTParameterDeclaration declaration = getParameterDeclaration(nodeFactory, null);
|
||||
if (declaration == null)
|
||||
return null;
|
||||
ASTWriterVisitor writer = new ASTWriterVisitor();
|
||||
ASTWriterVisitor writer = new ASTWriterVisitor(translationUnit.getOriginatingTranslationUnit());
|
||||
declaration.accept(writer);
|
||||
return writer.toString();
|
||||
}
|
||||
|
@ -230,12 +232,13 @@ public class NameInformation {
|
|||
public String getReturnType() {
|
||||
if (!isReturnValue())
|
||||
return null;
|
||||
INodeFactory nodeFactory = name.getTranslationUnit().getASTNodeFactory();
|
||||
IASTTranslationUnit translationUnit = name.getTranslationUnit();
|
||||
INodeFactory nodeFactory = translationUnit.getASTNodeFactory();
|
||||
IASTDeclarator sourceDeclarator = getDeclarator();
|
||||
IASTDeclSpecifier declSpec = safeCopy(getDeclSpecifier());
|
||||
IASTDeclarator declarator = createDeclarator(nodeFactory, sourceDeclarator, null);
|
||||
IASTParameterDeclaration declaration = nodeFactory.newParameterDeclaration(declSpec, declarator);
|
||||
ASTWriterVisitor writer = new ASTWriterVisitor();
|
||||
ASTWriterVisitor writer = new ASTWriterVisitor(translationUnit.getOriginatingTranslationUnit());
|
||||
declaration.accept(writer);
|
||||
return writer.toString();
|
||||
}
|
||||
|
|
|
@ -1092,7 +1092,7 @@ public class ExtractFunctionRefactoring extends CRefactoring {
|
|||
buf.append(' ');
|
||||
}
|
||||
IASTParameterDeclaration declaration = parameter.getParameterDeclaration(nodeFactory);
|
||||
ASTWriterVisitor writer = new ASTWriterVisitor();
|
||||
ASTWriterVisitor writer = new ASTWriterVisitor(parameter.getTranslationUnit());
|
||||
declaration.accept(writer);
|
||||
buf.append(writer.toString());
|
||||
first = false;
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2016 Institute for Software, HSR Hochschule fuer Technik
|
||||
* Rapperswil, University of applied sciences.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.saveactions;
|
||||
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.actions.AlignConstAction;
|
||||
|
||||
/**
|
||||
* Save action to align all const specifiers in a given translation unit
|
||||
* according to the settings in the workspace preferences (left or right to
|
||||
* type).
|
||||
*
|
||||
*/
|
||||
public class AlignConstSaveAction {
|
||||
|
||||
public void perform(ITranslationUnit tu, IProgressMonitor monitor) {
|
||||
alignConstInActiveEditor(tu, monitor);
|
||||
}
|
||||
|
||||
private void alignConstInActiveEditor(ITranslationUnit translationUnit, IProgressMonitor monitor) {
|
||||
try {
|
||||
IASTTranslationUnit ast = translationUnit.getAST(null, ITranslationUnit.AST_SKIP_ALL_HEADERS);
|
||||
AlignConstAction.rewriteMisalignedConstSpecifiers(ast, monitor);
|
||||
} catch (CoreException e) {
|
||||
CUIPlugin.log(e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2134,6 +2134,13 @@ public class PreferenceConstants {
|
|||
*/
|
||||
public static final String INCLUDE_STYLE_MATCHING_PATTERN = "includeStyle.matchingPattern"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Preference key for whether to 'align' the const keyword to a specific position relative to the type name.
|
||||
*
|
||||
* @since 6.2
|
||||
*/
|
||||
public static final String ALIGN_ALL_CONST = "alignConst"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* A named preference that controls whether annotation roll over is used or not.
|
||||
* <p>
|
||||
|
@ -2252,6 +2259,7 @@ public class PreferenceConstants {
|
|||
store.setDefault(REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES, true);
|
||||
store.setDefault(ENSURE_NEWLINE_AT_EOF, true);
|
||||
store.setDefault(FORMAT_SOURCE_CODE, false);
|
||||
store.setDefault(ALIGN_ALL_CONST, false);
|
||||
store.setDefault(FORMAT_SOURCE_CODE_LIMIT_TO_EDITED_LINES, true);
|
||||
|
||||
// Formatter profile
|
||||
|
|
|
@ -115,6 +115,14 @@ public class CdtActionConstants {
|
|||
*/
|
||||
public static final String INDENT= "org.eclipse.cdt.ui.actions.Indent"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Source menu: name of standard Align Const global action
|
||||
* (value <code>"org.eclipse.cdt.ui.actions.AlignConst"</code>).
|
||||
*
|
||||
* @since 6.2
|
||||
*/
|
||||
public static final String ALIGN_CONST = "org.eclipse.cdt.ui.actions.AlignConst"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Source menu: name of standard Shift Right action
|
||||
* (value <code>"org.eclipse.cdt.ui.actions.ShiftRight"</code>).
|
||||
|
|
|
@ -130,6 +130,10 @@
|
|||
activityId="org.eclipse.cdt.debug.application.activity.filterMenus"
|
||||
pattern="org.eclipse.cdt.ui/org.eclipse.cdt.ui.actions.Indent">
|
||||
</activityPatternBinding>
|
||||
<activityPatternBinding
|
||||
activityId="org.eclipse.cdt.debug.application.activity.filterMenus"
|
||||
pattern="org.eclipse.cdt.ui/org.eclipse.cdt.ui.actions.AlignConst">
|
||||
</activityPatternBinding>
|
||||
<activityPatternBinding
|
||||
activityId="org.eclipse.cdt.debug.application.activity.filterMenus"
|
||||
pattern="org.eclipse.cdt.ui/org.eclipse.cdt.ui.actions.ShiftLeft">
|
||||
|
|
Loading…
Add table
Reference in a new issue