mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 09:46:02 +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 {
|
public String write(IASTNode rootNode, NodeCommentMap commentMap) throws ProblemRuntimeException {
|
||||||
ChangeGeneratorWriterVisitor writer = new ChangeGeneratorWriterVisitor(
|
ChangeGeneratorWriterVisitor writer = new ChangeGeneratorWriterVisitor(
|
||||||
modificationStore, null, commentMap);
|
modificationStore, null, commentMap, ConstPlacement.placeConstRight(rootNode));
|
||||||
if (rootNode != null) {
|
if (rootNode != null) {
|
||||||
rootNode.accept(writer);
|
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.ICPPASTNamespaceDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
|
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.core.parser.Keywords;
|
||||||
import org.eclipse.cdt.internal.core.dom.rewrite.ASTLiteralNode;
|
import org.eclipse.cdt.internal.core.dom.rewrite.ASTLiteralNode;
|
||||||
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
|
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
|
||||||
|
@ -93,6 +94,15 @@ public class ASTWriterVisitor extends ASTVisitor {
|
||||||
this(new NodeCommentMap());
|
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) {
|
public ASTWriterVisitor(NodeCommentMap commentMap) {
|
||||||
super();
|
super();
|
||||||
init(commentMap);
|
init(commentMap);
|
||||||
|
@ -114,6 +124,11 @@ public class ASTWriterVisitor extends ASTVisitor {
|
||||||
attributeWriter = new AttributeWriter(scribe, this, commentMap);
|
attributeWriter = new AttributeWriter(scribe, this, commentMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void configureForTU(ITranslationUnit tu) {
|
||||||
|
boolean placeConstRight = ConstPlacement.placeConstRight(tu);
|
||||||
|
declSpecWriter.setPlaceConstRight(placeConstRight);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return scribe.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
|
* @author Emanuel Graf IFS
|
||||||
*/
|
*/
|
||||||
public class DeclSpecWriter extends NodeWriter {
|
public class DeclSpecWriter extends NodeWriter {
|
||||||
|
private boolean constRight = false;
|
||||||
|
|
||||||
public DeclSpecWriter(Scribe scribe, ASTWriterVisitor visitor, NodeCommentMap commentMap) {
|
public DeclSpecWriter(Scribe scribe, ASTWriterVisitor visitor, NodeCommentMap commentMap) {
|
||||||
super(scribe, visitor, commentMap);
|
super(scribe, visitor, commentMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setPlaceConstRight(boolean placeConstRight) {
|
||||||
|
constRight = placeConstRight;
|
||||||
|
}
|
||||||
|
|
||||||
protected void writeDelcSpec(IASTDeclSpecifier declSpec) {
|
protected void writeDelcSpec(IASTDeclSpecifier declSpec) {
|
||||||
// Write general DelcSpec Keywords
|
writeDeclSpec(declSpec, !constRight);
|
||||||
writeDeclSpec(declSpec);
|
|
||||||
if (declSpec instanceof ICPPASTDeclSpecifier) {
|
if (declSpec instanceof ICPPASTDeclSpecifier) {
|
||||||
writeCPPDeclSpec((ICPPASTDeclSpecifier) declSpec);
|
writeCPPDeclSpec((ICPPASTDeclSpecifier) declSpec);
|
||||||
} else if (declSpec instanceof ICASTDeclSpecifier) {
|
} else if (declSpec instanceof ICASTDeclSpecifier) {
|
||||||
writeCDeclSpec((ICASTDeclSpecifier) declSpec);
|
writeCDeclSpec((ICASTDeclSpecifier) declSpec);
|
||||||
}
|
}
|
||||||
|
if(constRight && declSpec.isConst()) {
|
||||||
|
scribe.printSpace();
|
||||||
|
scribe.printStringSpace(Keywords.CONST);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getCPPSimpleDecSpecifier(ICPPASTSimpleDeclSpecifier simpDeclSpec) {
|
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()) {
|
if (declSpec.isInline()) {
|
||||||
scribe.printStringSpace(Keywords.INLINE);
|
scribe.printStringSpace(Keywords.INLINE);
|
||||||
}
|
}
|
||||||
|
@ -364,7 +372,7 @@ public class DeclSpecWriter extends NodeWriter {
|
||||||
scribe.printStringSpace(Keywords.REGISTER);
|
scribe.printStringSpace(Keywords.REGISTER);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (declSpec.isConst()) {
|
if (declSpec.isConst() && constEnabled) {
|
||||||
scribe.printStringSpace(Keywords.CONST);
|
scribe.printStringSpace(Keywords.CONST);
|
||||||
}
|
}
|
||||||
if (declSpec.isVolatile()) {
|
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.ASTModificationStore;
|
||||||
import org.eclipse.cdt.internal.core.dom.rewrite.ASTRewriteAnalyzer;
|
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.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.ContainerNode;
|
||||||
import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ProblemRuntimeException;
|
import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ProblemRuntimeException;
|
||||||
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
|
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);
|
List<ASTModification> modifications = getModifications(anchorNode, ModificationKind.INSERT_BEFORE);
|
||||||
if (modifications.isEmpty())
|
if (modifications.isEmpty())
|
||||||
return;
|
return;
|
||||||
ChangeGeneratorWriterVisitor writer =
|
ChangeGeneratorWriterVisitor writer = createChangeWriterForNode(anchorNode);
|
||||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
|
||||||
IASTNode newNode = null;
|
IASTNode newNode = null;
|
||||||
for (ASTModification modification : modifications) {
|
for (ASTModification modification : modifications) {
|
||||||
boolean first = newNode == null;
|
boolean first = newNode == null;
|
||||||
|
@ -384,8 +384,7 @@ public class ChangeGenerator extends ASTVisitor {
|
||||||
private void handleReplace(IASTNode node) {
|
private void handleReplace(IASTNode node) {
|
||||||
List<ASTModification> modifications = getModifications(node, ModificationKind.REPLACE);
|
List<ASTModification> modifications = getModifications(node, ModificationKind.REPLACE);
|
||||||
String source = node.getTranslationUnit().getRawSignature();
|
String source = node.getTranslationUnit().getRawSignature();
|
||||||
ChangeGeneratorWriterVisitor writer =
|
ChangeGeneratorWriterVisitor writer = createChangeWriterForNode(node);
|
||||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
|
||||||
IASTFileLocation fileLocation = node.getFileLocation();
|
IASTFileLocation fileLocation = node.getFileLocation();
|
||||||
addToRootEdit(node);
|
addToRootEdit(node);
|
||||||
if (modifications.size() == 1 && modifications.get(0).getNewNode() == null) {
|
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);
|
List<ASTModification> modifications = getModifications(node, ModificationKind.APPEND_CHILD);
|
||||||
if (modifications.isEmpty())
|
if (modifications.isEmpty())
|
||||||
return;
|
return;
|
||||||
ChangeGeneratorWriterVisitor writer =
|
ChangeGeneratorWriterVisitor writer = createChangeWriterForNode(node);
|
||||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
|
||||||
ReplaceEdit anchor = getAppendAnchor(node);
|
ReplaceEdit anchor = getAppendAnchor(node);
|
||||||
Assert.isNotNull(anchor);
|
Assert.isNotNull(anchor);
|
||||||
IASTNode precedingNode = getLastNodeBeforeAppendPoint(node);
|
IASTNode precedingNode = getLastNodeBeforeAppendPoint(node);
|
||||||
|
@ -491,8 +489,7 @@ public class ChangeGenerator extends ASTVisitor {
|
||||||
int endOffset = skipTrailingBlankLines(source, offset);
|
int endOffset = skipTrailingBlankLines(source, offset);
|
||||||
|
|
||||||
addToRootEdit(node);
|
addToRootEdit(node);
|
||||||
ChangeGeneratorWriterVisitor writer =
|
ChangeGeneratorWriterVisitor writer = createChangeWriterForNode(node);
|
||||||
new ChangeGeneratorWriterVisitor(modificationStore, commentMap);
|
|
||||||
IASTNode newNode = null;
|
IASTNode newNode = null;
|
||||||
for (ASTModification modification : modifications) {
|
for (ASTModification modification : modifications) {
|
||||||
boolean first = newNode == null;
|
boolean first = newNode == null;
|
||||||
|
@ -525,6 +522,10 @@ public class ChangeGenerator extends ASTVisitor {
|
||||||
addChildEdit(new DeleteEdit(offset, endOffset - offset));
|
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
|
* Returns the list of nodes the given node is part of, for example function parameters if
|
||||||
* the node is a parameter.
|
* the node is a parameter.
|
||||||
|
|
|
@ -50,7 +50,7 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
|
||||||
private ModificationScopeStack stack;
|
private ModificationScopeStack stack;
|
||||||
|
|
||||||
public ChangeGeneratorWriterVisitor(ASTVisitor delegateVisitor,
|
public ChangeGeneratorWriterVisitor(ASTVisitor delegateVisitor,
|
||||||
ASTModificationStore modificationStore, String fileScope, NodeCommentMap commentMap) {
|
ASTModificationStore modificationStore, String fileScope, NodeCommentMap commentMap, boolean placeConstRight) {
|
||||||
super(commentMap);
|
super(commentMap);
|
||||||
|
|
||||||
this.modificationStore = modificationStore;
|
this.modificationStore = modificationStore;
|
||||||
|
@ -76,11 +76,21 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, NodeCommentMap nodeMap) {
|
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,
|
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, String fileScope,
|
||||||
NodeCommentMap commentMap) {
|
NodeCommentMap commentMap) {
|
||||||
|
this(modStore, fileScope, commentMap, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, String fileScope,
|
||||||
|
NodeCommentMap commentMap, boolean placeConstRight) {
|
||||||
super(commentMap);
|
super(commentMap);
|
||||||
this.modificationStore = modStore;
|
this.modificationStore = modStore;
|
||||||
this.fileScope = fileScope;
|
this.fileScope = fileScope;
|
||||||
|
@ -89,7 +99,7 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
|
||||||
declaratorWriter = new ModifiedASTDeclaratorWriter(scribe, this, stack, commentMap);
|
declaratorWriter = new ModifiedASTDeclaratorWriter(scribe, this, stack, commentMap);
|
||||||
expWriter = new ModifiedASTExpressionWriter(scribe, this, macroHandler, stack, commentMap);
|
expWriter = new ModifiedASTExpressionWriter(scribe, this, macroHandler, stack, commentMap);
|
||||||
statementWriter = new ModifiedASTStatementWriter(scribe, this, 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);
|
declarationWriter = new ModifiedASTDeclarationWriter(scribe, this, stack, commentMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,9 @@ public class ModifiedASTDeclSpecWriter extends DeclSpecWriter {
|
||||||
private final ASTModificationHelper modificationHelper;
|
private final ASTModificationHelper modificationHelper;
|
||||||
|
|
||||||
public ModifiedASTDeclSpecWriter(Scribe scribe, ASTWriterVisitor visitor,
|
public ModifiedASTDeclSpecWriter(Scribe scribe, ASTWriterVisitor visitor,
|
||||||
ModificationScopeStack stack, NodeCommentMap commentMap) {
|
ModificationScopeStack stack, NodeCommentMap commentMap, boolean placeConstRight) {
|
||||||
super(scribe, visitor, commentMap);
|
super(scribe, visitor, commentMap);
|
||||||
|
setPlaceConstRight(placeConstRight);
|
||||||
this.modificationHelper = new ASTModificationHelper(stack);
|
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
|
// 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.
|
// 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.
|
* 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.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.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.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,
|
AsmPartitionerTest.class,
|
||||||
|
|
||||||
// smart edit tests
|
// smart edit tests
|
||||||
|
AlignConstActionTest.class,
|
||||||
CAutoIndentTest.class,
|
CAutoIndentTest.class,
|
||||||
CHeuristicScannerTest.class,
|
CHeuristicScannerTest.class,
|
||||||
BracketInserterTest.class,
|
BracketInserterTest.class,
|
||||||
|
|
|
@ -123,6 +123,9 @@ ActionDefinition.removeBlockComment.description= Removes the block comment enclo
|
||||||
ActionDefinition.indent.name= Indent Line
|
ActionDefinition.indent.name= Indent Line
|
||||||
ActionDefinition.indent.description=Indents the current 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.name=Format
|
||||||
ActionDefinition.format.description=Formats Source Code
|
ActionDefinition.format.description=Formats Source Code
|
||||||
|
|
||||||
|
@ -613,6 +616,7 @@ headerFileRenameParticipant.name = Header File Rename
|
||||||
|
|
||||||
FormatAction.label= &Format
|
FormatAction.label= &Format
|
||||||
IndentAction.label= Correct &Indentation
|
IndentAction.label= Correct &Indentation
|
||||||
|
AlignConst.label= &Align Const
|
||||||
OrganizeIncludesAction.label= Or&ganize Includes
|
OrganizeIncludesAction.label= Or&ganize Includes
|
||||||
AddIncludeAction.label= A&dd Include
|
AddIncludeAction.label= A&dd Include
|
||||||
SortLinesAction.label= Sor&t Lines
|
SortLinesAction.label= Sor&t Lines
|
||||||
|
|
|
@ -1956,6 +1956,13 @@
|
||||||
menubarPath="org.eclipse.jdt.ui.source.menu/editGroup"
|
menubarPath="org.eclipse.jdt.ui.source.menu/editGroup"
|
||||||
id="org.eclipse.cdt.ui.actions.Indent">
|
id="org.eclipse.cdt.ui.actions.Indent">
|
||||||
</action>
|
</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
|
<action
|
||||||
definitionId="org.eclipse.ui.edit.text.shiftLeft"
|
definitionId="org.eclipse.ui.edit.text.shiftLeft"
|
||||||
disabledIcon="icons/dlcl16/shift_l_edit.gif"
|
disabledIcon="icons/dlcl16/shift_l_edit.gif"
|
||||||
|
@ -2397,6 +2404,11 @@
|
||||||
contextId="org.eclipse.cdt.ui.cEditorScope"
|
contextId="org.eclipse.cdt.ui.cEditorScope"
|
||||||
commandId="org.eclipse.cdt.ui.edit.text.c.indent"
|
commandId="org.eclipse.cdt.ui.edit.text.c.indent"
|
||||||
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
|
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
|
<key
|
||||||
sequence="M2+M3+Z"
|
sequence="M2+M3+Z"
|
||||||
contextId="org.eclipse.cdt.ui.cEditorScope"
|
contextId="org.eclipse.cdt.ui.cEditorScope"
|
||||||
|
@ -3218,6 +3230,12 @@
|
||||||
categoryId="org.eclipse.ui.category.edit"
|
categoryId="org.eclipse.ui.category.edit"
|
||||||
id="org.eclipse.cdt.ui.edit.text.c.select.last">
|
id="org.eclipse.cdt.ui.edit.text.c.select.last">
|
||||||
</command>
|
</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>
|
||||||
<extension
|
<extension
|
||||||
id="pdomSearchPage"
|
id="pdomSearchPage"
|
||||||
|
@ -4935,6 +4953,9 @@
|
||||||
<key name="markOverloadedOperatorsOccurrences"/>
|
<key name="markOverloadedOperatorsOccurrences"/>
|
||||||
<key name="scalability." match="prefix"/>
|
<key name="scalability." match="prefix"/>
|
||||||
<key name="content_assist_proposals_timeout"/>
|
<key name="content_assist_proposals_timeout"/>
|
||||||
|
<key
|
||||||
|
name="alignConst">
|
||||||
|
</key>
|
||||||
</entry>
|
</entry>
|
||||||
</mapping>
|
</mapping>
|
||||||
<description>
|
<description>
|
||||||
|
@ -4958,6 +4979,12 @@
|
||||||
<key name="nameStyle." match="prefix"/>
|
<key name="nameStyle." match="prefix"/>
|
||||||
<key name="organizeIncludes." match="prefix"/>
|
<key name="organizeIncludes." match="prefix"/>
|
||||||
</entry>
|
</entry>
|
||||||
|
<entry
|
||||||
|
node="org.eclipse.cdt.core">
|
||||||
|
<key
|
||||||
|
name="astwriter.placeConstRightOfType">
|
||||||
|
</key>
|
||||||
|
</entry>
|
||||||
</mapping>
|
</mapping>
|
||||||
<description>
|
<description>
|
||||||
%transfer.CodeStyle.description
|
%transfer.CodeStyle.description
|
||||||
|
|
|
@ -93,6 +93,9 @@ public class ActionMessages extends NLS {
|
||||||
public static String FormatAllAction_failedvalidateedit_message;
|
public static String FormatAllAction_failedvalidateedit_message;
|
||||||
public static String FormatAllAction_noundo_title;
|
public static String FormatAllAction_noundo_title;
|
||||||
public static String FormatAllAction_noundo_message;
|
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_label;
|
||||||
public static String CollapseAllAction_tooltip;
|
public static String CollapseAllAction_tooltip;
|
||||||
public static String CollapseAllAction_description;
|
public static String CollapseAllAction_description;
|
||||||
|
|
|
@ -113,6 +113,10 @@ FormatAllAction_failedvalidateedit_message=Problems while accessing selected fil
|
||||||
FormatAllAction_noundo_title=Format
|
FormatAllAction_noundo_title=Format
|
||||||
FormatAllAction_noundo_message='Undo' is not supported by this operation. Do you want to continue?
|
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_label=Collapse All
|
||||||
CollapseAllAction_tooltip=Collapse All
|
CollapseAllAction_tooltip=Collapse All
|
||||||
CollapseAllAction_description=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.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.IProblemRequestorExtension;
|
||||||
import org.eclipse.cdt.internal.ui.text.spelling.CoreSpellingProblem;
|
import org.eclipse.cdt.internal.ui.text.spelling.CoreSpellingProblem;
|
||||||
import org.eclipse.cdt.internal.ui.util.EditorUtility;
|
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)
|
private void performSaveActions(ITranslationUnit tu, ITextFileBuffer buffer, IProgressMonitor monitor)
|
||||||
throws CoreException {
|
throws CoreException {
|
||||||
if (shouldRemoveTrailingWhitespace() || shouldAddNewlineAtEof() || shouldFormatCode()) {
|
if (shouldRemoveTrailingWhitespace() || shouldAddNewlineAtEof() || shouldFormatCode() || shouldAlignAllConst()) {
|
||||||
SubMonitor progress = SubMonitor.convert(monitor, 2);
|
SubMonitor progress = SubMonitor.convert(monitor, 3);
|
||||||
IDocumentUndoManager undoManager= null;
|
IDocumentUndoManager undoManager= null;
|
||||||
IRegion[] changedRegions= needsChangedRegions() ?
|
IRegion[] changedRegions= needsChangedRegions() ?
|
||||||
EditorUtility.calculateChangedLineRegions(buffer, progress.split(1)) : null;
|
EditorUtility.calculateChangedLineRegions(buffer, progress.split(1)) : null;
|
||||||
|
@ -992,6 +993,11 @@ public class CDocumentProvider extends TextFileDocumentProvider {
|
||||||
}
|
}
|
||||||
edit.apply(document);
|
edit.apply(document);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shouldAlignAllConst()) {
|
||||||
|
new AlignConstSaveAction().perform(tu, progress.split(1));
|
||||||
|
}
|
||||||
|
|
||||||
} catch (MalformedTreeException | BadLocationException e) {
|
} catch (MalformedTreeException | BadLocationException e) {
|
||||||
String message= e.getMessage();
|
String message= e.getMessage();
|
||||||
if (message == null)
|
if (message == null)
|
||||||
|
@ -1028,6 +1034,11 @@ public class CDocumentProvider extends TextFileDocumentProvider {
|
||||||
PreferenceConstants.REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES);
|
PreferenceConstants.REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean shouldAlignAllConst() {
|
||||||
|
return PreferenceConstants.getPreferenceStore().getBoolean(
|
||||||
|
PreferenceConstants.ALIGN_ALL_CONST);
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean needsChangedRegions() {
|
private static boolean needsChangedRegions() {
|
||||||
return shouldRemoveTrailingWhitespace() && isLimitedRemoveTrailingWhitespace()
|
return shouldRemoveTrailingWhitespace() && isLimitedRemoveTrailingWhitespace()
|
||||||
|| shouldFormatCode() && isLimitedFormatCode();
|
|| 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.ICHelpContextIds;
|
||||||
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
|
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
|
||||||
import org.eclipse.cdt.internal.ui.actions.AddBlockCommentAction;
|
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.FindWordAction;
|
||||||
import org.eclipse.cdt.internal.ui.actions.FoldingActionGroup;
|
import org.eclipse.cdt.internal.ui.actions.FoldingActionGroup;
|
||||||
import org.eclipse.cdt.internal.ui.actions.GoToNextPreviousMemberAction;
|
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$
|
markAsSelectionDependentAction("Indent", true); //$NON-NLS-1$
|
||||||
// PlatformUI.getWorkbench().getHelpSystem().setHelp(action, ICHelpContextIds.INDENT_ACTION);
|
// 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$
|
action = new IndentAction(bundle, "Indent.", this, true); //$NON-NLS-1$
|
||||||
setAction("IndentOnTab", action); //$NON-NLS-1$
|
setAction("IndentOnTab", action); //$NON-NLS-1$
|
||||||
markAsStateDependentAction("IndentOnTab", true); //$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.ADD_BLOCK_COMMENT, getAction(textEditor, "AddBlockComment")); //$NON-NLS-1$
|
||||||
bars.setGlobalActionHandler(CdtActionConstants.REMOVE_BLOCK_COMMENT, getAction(textEditor, "RemoveBlockComment")); //$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.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.ADD_INCLUDE, getAction(textEditor, "AddInclude")); //$NON-NLS-1$
|
||||||
bars.setGlobalActionHandler(CdtActionConstants.ORGANIZE_INCLUDES, getAction(textEditor, "OrganizeIncludes")); //$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$
|
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.tooltip=&Indent Current Line to Correct Indentation
|
||||||
Indent.description=&Indents the current line or selection depending on surrounding source code
|
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.label= N&ext Member
|
||||||
GotoNextMember.tooltip=Move the Caret to the Next Member of the Translation Unit
|
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
|
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$
|
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
|
* Action definition ID of the source -> format action
|
||||||
* (value <code>"org.eclipse.cdt.ui.edit.text.c.format"</code>).
|
* (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.swt.widgets.Control;
|
||||||
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
|
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.ui.PreferenceConstants;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
|
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
|
||||||
|
@ -32,12 +34,15 @@ class CodeStyleBlock extends OptionsConfigurationBlock {
|
||||||
getCDTUIKey(PreferenceConstants.FUNCTION_OUTPUT_PARAMETERS_BEFORE_INPUT);
|
getCDTUIKey(PreferenceConstants.FUNCTION_OUTPUT_PARAMETERS_BEFORE_INPUT);
|
||||||
private static final Key FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER =
|
private static final Key FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER =
|
||||||
getCDTUIKey(PreferenceConstants.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() {
|
private static Key[] getAllKeys() {
|
||||||
return new Key[] {
|
return new Key[] {
|
||||||
CLASS_MEMBER_ASCENDING_VISIBILITY_ORDER,
|
CLASS_MEMBER_ASCENDING_VISIBILITY_ORDER,
|
||||||
FUNCTION_OUTPUT_PARAMETERS_BEFORE_INPUT,
|
FUNCTION_OUTPUT_PARAMETERS_BEFORE_INPUT,
|
||||||
FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER,
|
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);
|
composite = addSubsection(control, PreferencesMessages.CodeStyleBlock_function_output_parameter_style);
|
||||||
fillFunctionOutputParameterStyleSection(composite);
|
fillFunctionOutputParameterStyleSection(composite);
|
||||||
|
|
||||||
|
composite = addSubsection(control, PreferencesMessages.CodeStyleBlock_const_keyword_placement);
|
||||||
|
fillConstPlacementsSections(composite);
|
||||||
|
|
||||||
scrolled.setContent(control);
|
scrolled.setContent(control);
|
||||||
final Point size= control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
|
final Point size= control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
|
||||||
scrolled.setMinSize(size.x, size.y);
|
scrolled.setMinSize(size.x, size.y);
|
||||||
|
@ -104,6 +112,17 @@ class CodeStyleBlock extends OptionsConfigurationBlock {
|
||||||
FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER, TRUE_FALSE, 0);
|
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
|
@Override
|
||||||
protected void validateSettings(Key changedKey, String oldValue, String newValue) {
|
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_inAllLines;
|
||||||
public static String SaveActionsPreferencePage_inEditedLines;
|
public static String SaveActionsPreferencePage_inEditedLines;
|
||||||
public static String SaveActionsPreferencePage_ensureNewline;
|
public static String SaveActionsPreferencePage_ensureNewline;
|
||||||
|
public static String SaveActionsPreferencePage_alignConst;
|
||||||
|
|
||||||
public static String SmartTypingConfigurationBlock_autoclose_title;
|
public static String SmartTypingConfigurationBlock_autoclose_title;
|
||||||
public static String SmartTypingConfigurationBlock_autoindent_newlines;
|
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_function_output_parameter_style;
|
||||||
public static String CodeStyleBlock_pass_by_reference;
|
public static String CodeStyleBlock_pass_by_reference;
|
||||||
public static String CodeStyleBlock_pass_by_pointer;
|
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_title;
|
||||||
public static String TodoTaskPreferencePage_description;
|
public static String TodoTaskPreferencePage_description;
|
||||||
|
|
|
@ -120,6 +120,7 @@ SaveActionsPreferencePage_removeTrailingWhitespace=Remove trailing &whitespace
|
||||||
SaveActionsPreferencePage_inAllLines=In all line&s
|
SaveActionsPreferencePage_inAllLines=In all line&s
|
||||||
SaveActionsPreferencePage_inEditedLines=In edi&ted lines
|
SaveActionsPreferencePage_inEditedLines=In edi&ted lines
|
||||||
SaveActionsPreferencePage_ensureNewline=Ensure &newline at the end of file
|
SaveActionsPreferencePage_ensureNewline=Ensure &newline at the end of file
|
||||||
|
SaveActionsPreferencePage_alignConst=Align Const
|
||||||
|
|
||||||
TemplatePreferencePage_Viewer_preview=Preview:
|
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_function_output_parameter_style=Output parameters of C++ functions:
|
||||||
CodeStyleBlock_pass_by_reference=Pass by &reference
|
CodeStyleBlock_pass_by_reference=Pass by &reference
|
||||||
CodeStyleBlock_pass_by_pointer=Pass by poi&nter
|
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.
|
# Task tags.
|
||||||
TodoTaskPreferencePage_title=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.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;
|
||||||
import static org.eclipse.cdt.ui.PreferenceConstants.REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES;
|
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;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
@ -58,6 +59,8 @@ public class SaveActionsPreferencePage extends AbstractPreferencePage {
|
||||||
REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES));
|
REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES));
|
||||||
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN,
|
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN,
|
||||||
ENSURE_NEWLINE_AT_EOF));
|
ENSURE_NEWLINE_AT_EOF));
|
||||||
|
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN,
|
||||||
|
ALIGN_ALL_CONST));
|
||||||
|
|
||||||
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
|
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
|
||||||
overlayKeys.toArray(keys);
|
overlayKeys.toArray(keys);
|
||||||
|
@ -123,6 +126,11 @@ public class SaveActionsPreferencePage extends AbstractPreferencePage {
|
||||||
addCheckBox(composite, PreferencesMessages.SaveActionsPreferencePage_ensureNewline,
|
addCheckBox(composite, PreferencesMessages.SaveActionsPreferencePage_ensureNewline,
|
||||||
ENSURE_NEWLINE_AT_EOF, 0);
|
ENSURE_NEWLINE_AT_EOF, 0);
|
||||||
|
|
||||||
|
ControlFactory.createEmptySpace(composite, 1);
|
||||||
|
|
||||||
|
addCheckBox(composite, PreferencesMessages.SaveActionsPreferencePage_alignConst,
|
||||||
|
ALIGN_ALL_CONST, 0);
|
||||||
|
|
||||||
return composite;
|
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.IASTPointerOperator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
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.INodeFactory;
|
||||||
import org.eclipse.cdt.core.dom.ast.IType;
|
import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit;
|
||||||
|
@ -213,11 +214,12 @@ public class NameInformation {
|
||||||
public String getTypeName() {
|
public String getTypeName() {
|
||||||
if (newTypeName != null)
|
if (newTypeName != null)
|
||||||
return newTypeName;
|
return newTypeName;
|
||||||
INodeFactory nodeFactory = name.getTranslationUnit().getASTNodeFactory();
|
IASTTranslationUnit translationUnit = name.getTranslationUnit();
|
||||||
|
INodeFactory nodeFactory = translationUnit.getASTNodeFactory();
|
||||||
IASTParameterDeclaration declaration = getParameterDeclaration(nodeFactory, null);
|
IASTParameterDeclaration declaration = getParameterDeclaration(nodeFactory, null);
|
||||||
if (declaration == null)
|
if (declaration == null)
|
||||||
return null;
|
return null;
|
||||||
ASTWriterVisitor writer = new ASTWriterVisitor();
|
ASTWriterVisitor writer = new ASTWriterVisitor(translationUnit.getOriginatingTranslationUnit());
|
||||||
declaration.accept(writer);
|
declaration.accept(writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
}
|
}
|
||||||
|
@ -230,12 +232,13 @@ public class NameInformation {
|
||||||
public String getReturnType() {
|
public String getReturnType() {
|
||||||
if (!isReturnValue())
|
if (!isReturnValue())
|
||||||
return null;
|
return null;
|
||||||
INodeFactory nodeFactory = name.getTranslationUnit().getASTNodeFactory();
|
IASTTranslationUnit translationUnit = name.getTranslationUnit();
|
||||||
|
INodeFactory nodeFactory = translationUnit.getASTNodeFactory();
|
||||||
IASTDeclarator sourceDeclarator = getDeclarator();
|
IASTDeclarator sourceDeclarator = getDeclarator();
|
||||||
IASTDeclSpecifier declSpec = safeCopy(getDeclSpecifier());
|
IASTDeclSpecifier declSpec = safeCopy(getDeclSpecifier());
|
||||||
IASTDeclarator declarator = createDeclarator(nodeFactory, sourceDeclarator, null);
|
IASTDeclarator declarator = createDeclarator(nodeFactory, sourceDeclarator, null);
|
||||||
IASTParameterDeclaration declaration = nodeFactory.newParameterDeclaration(declSpec, declarator);
|
IASTParameterDeclaration declaration = nodeFactory.newParameterDeclaration(declSpec, declarator);
|
||||||
ASTWriterVisitor writer = new ASTWriterVisitor();
|
ASTWriterVisitor writer = new ASTWriterVisitor(translationUnit.getOriginatingTranslationUnit());
|
||||||
declaration.accept(writer);
|
declaration.accept(writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1092,7 +1092,7 @@ public class ExtractFunctionRefactoring extends CRefactoring {
|
||||||
buf.append(' ');
|
buf.append(' ');
|
||||||
}
|
}
|
||||||
IASTParameterDeclaration declaration = parameter.getParameterDeclaration(nodeFactory);
|
IASTParameterDeclaration declaration = parameter.getParameterDeclaration(nodeFactory);
|
||||||
ASTWriterVisitor writer = new ASTWriterVisitor();
|
ASTWriterVisitor writer = new ASTWriterVisitor(parameter.getTranslationUnit());
|
||||||
declaration.accept(writer);
|
declaration.accept(writer);
|
||||||
buf.append(writer.toString());
|
buf.append(writer.toString());
|
||||||
first = false;
|
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$
|
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.
|
* A named preference that controls whether annotation roll over is used or not.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -2252,6 +2259,7 @@ public class PreferenceConstants {
|
||||||
store.setDefault(REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES, true);
|
store.setDefault(REMOVE_TRAILING_WHITESPACE_LIMIT_TO_EDITED_LINES, true);
|
||||||
store.setDefault(ENSURE_NEWLINE_AT_EOF, true);
|
store.setDefault(ENSURE_NEWLINE_AT_EOF, true);
|
||||||
store.setDefault(FORMAT_SOURCE_CODE, false);
|
store.setDefault(FORMAT_SOURCE_CODE, false);
|
||||||
|
store.setDefault(ALIGN_ALL_CONST, false);
|
||||||
store.setDefault(FORMAT_SOURCE_CODE_LIMIT_TO_EDITED_LINES, true);
|
store.setDefault(FORMAT_SOURCE_CODE_LIMIT_TO_EDITED_LINES, true);
|
||||||
|
|
||||||
// Formatter profile
|
// Formatter profile
|
||||||
|
|
|
@ -115,6 +115,14 @@ public class CdtActionConstants {
|
||||||
*/
|
*/
|
||||||
public static final String INDENT= "org.eclipse.cdt.ui.actions.Indent"; //$NON-NLS-1$
|
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
|
* Source menu: name of standard Shift Right action
|
||||||
* (value <code>"org.eclipse.cdt.ui.actions.ShiftRight"</code>).
|
* (value <code>"org.eclipse.cdt.ui.actions.ShiftRight"</code>).
|
||||||
|
|
|
@ -130,6 +130,10 @@
|
||||||
activityId="org.eclipse.cdt.debug.application.activity.filterMenus"
|
activityId="org.eclipse.cdt.debug.application.activity.filterMenus"
|
||||||
pattern="org.eclipse.cdt.ui/org.eclipse.cdt.ui.actions.Indent">
|
pattern="org.eclipse.cdt.ui/org.eclipse.cdt.ui.actions.Indent">
|
||||||
</activityPatternBinding>
|
</activityPatternBinding>
|
||||||
|
<activityPatternBinding
|
||||||
|
activityId="org.eclipse.cdt.debug.application.activity.filterMenus"
|
||||||
|
pattern="org.eclipse.cdt.ui/org.eclipse.cdt.ui.actions.AlignConst">
|
||||||
|
</activityPatternBinding>
|
||||||
<activityPatternBinding
|
<activityPatternBinding
|
||||||
activityId="org.eclipse.cdt.debug.application.activity.filterMenus"
|
activityId="org.eclipse.cdt.debug.application.activity.filterMenus"
|
||||||
pattern="org.eclipse.cdt.ui/org.eclipse.cdt.ui.actions.ShiftLeft">
|
pattern="org.eclipse.cdt.ui/org.eclipse.cdt.ui.actions.ShiftLeft">
|
||||||
|
|
Loading…
Add table
Reference in a new issue