1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Merge branch 'master' into sd90

This commit is contained in:
Andrew Gvozdev 2011-07-15 10:57:18 -04:00
commit 89c6f3a80c
36 changed files with 825 additions and 596 deletions

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2010 IBM Corporation and others. * Copyright (c) 2004, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -68,18 +68,18 @@ import org.w3c.dom.Element;
public class PerProjectSICollector implements IScannerInfoCollector3, IScannerInfoCollectorCleaner { public class PerProjectSICollector implements IScannerInfoCollector3, IScannerInfoCollectorCleaner {
public static final String COLLECTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".PerProjectSICollector"; //$NON-NLS-1$ public static final String COLLECTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".PerProjectSICollector"; //$NON-NLS-1$
private IProject project; protected IProject project;
private InfoContext context; protected InfoContext context;
private boolean isBuiltinConfig= false; private boolean isBuiltinConfig= false;
private Map<ScannerInfoTypes, List<String>> discoveredSI; protected Map<ScannerInfoTypes, List<String>> discoveredSI;
// private List discoveredIncludes; // private List discoveredIncludes;
// private List discoveredSymbols; // private List discoveredSymbols;
// private List discoveredTSO; // target specific options // private List discoveredTSO; // target specific options
// cumulative values // cumulative values
private List<String> sumDiscoveredIncludes; protected List<String> sumDiscoveredIncludes;
private Map<String, SymbolEntry> sumDiscoveredSymbols; private Map<String, SymbolEntry> sumDiscoveredSymbols;
private boolean scPersisted = false; protected boolean scPersisted = false;
public PerProjectSICollector() { public PerProjectSICollector() {
discoveredSI = new HashMap<ScannerInfoTypes, List<String>>(); discoveredSI = new HashMap<ScannerInfoTypes, List<String>>();
@ -185,7 +185,7 @@ public class PerProjectSICollector implements IScannerInfoCollector3, IScannerIn
* @param ordered - to preserve order or append at the end * @param ordered - to preserve order or append at the end
* @return boolean - true if added * @return boolean - true if added
*/ */
private boolean addItemsWithOrder(List<String> sumIncludes, List<String> includes, boolean ordered) { protected boolean addItemsWithOrder(List<String> sumIncludes, List<String> includes, boolean ordered) {
if (includes.isEmpty()) if (includes.isEmpty())
return false; return false;
@ -321,7 +321,7 @@ public class PerProjectSICollector implements IScannerInfoCollector3, IScannerIn
/** /**
* Compare symbol definitions with already discovered. * Compare symbol definitions with already discovered.
*/ */
private boolean definedSymbolsNeedUpdate(IPerProjectDiscoveredPathInfo discPathInfo) { protected boolean definedSymbolsNeedUpdate(IPerProjectDiscoveredPathInfo discPathInfo) {
boolean addedSymbols = false; boolean addedSymbols = false;
List<String> discoveredSymbols = discoveredSI.get(ScannerInfoTypes.SYMBOL_DEFINITIONS); List<String> discoveredSymbols = discoveredSI.get(ScannerInfoTypes.SYMBOL_DEFINITIONS);
if (discoveredSymbols != null) { if (discoveredSymbols != null) {

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2000, 2008 QNX Software Systems and others. * Copyright (c) 2000, 2011 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -19,14 +19,14 @@ import org.eclipse.jface.action.Separator;
import org.eclipse.ui.IActionBars; import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.texteditor.BasicTextEditorActionContributor; import org.eclipse.ui.editors.text.TextEditorActionContributor;
import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.eclipse.ui.texteditor.RetargetTextEditorAction; import org.eclipse.ui.texteditor.RetargetTextEditorAction;
/** /**
*/ */
public class MakefileEditorActionContributor extends BasicTextEditorActionContributor { public class MakefileEditorActionContributor extends TextEditorActionContributor {
private MakefileEditorTogglePresentationAction fTogglePresentation; private MakefileEditorTogglePresentationAction fTogglePresentation;
private OpenDeclarationAction fOpenDeclarationAction; private OpenDeclarationAction fOpenDeclarationAction;

View file

@ -1132,25 +1132,6 @@ Overrides language id specified with the languageId attribute.
</documentation> </documentation>
</annotation> </annotation>
</attribute> </attribute>
<attribute name="fieldEditor" type="string">
<annotation>
<documentation>
Optional ID of the custom field-editor to represent this build-option in the project Properties dialog UI. If no custom field-editor ID is specified then the option will be represented by one of the built-in field-editors based on the option&apos;s &lt;code&gt;valueType&lt;/code&gt; attribute.
A custom field-editor needs to be registered, under the same ID, through the &lt;code&gt;org.eclipse.cdt.managedbuilder.ui.buildDefinitionsUI&lt;/code&gt; extension-point&apos;s &lt;code&gt;&amp;lt;fieldEditor&amp;gt;&lt;/code&gt; element.
</documentation>
<appInfo>
<meta.attribute kind="identifier" basedOn="org.eclipse.cdt.managedbuilder.ui.buildDefinitionsUI/fieldEditor/@id"/>
</appInfo>
</annotation>
</attribute>
<attribute name="fieldEditorExtraArgument" type="string">
<annotation>
<documentation>
An optional extra text string that is passed into the field-editor. Can be used to parameterize the field-editor instance.
</documentation>
</annotation>
</attribute>
</complexType> </complexType>
</element> </element>
@ -1458,6 +1439,25 @@ Additional special types exist to flag options of special relevance to the build
</documentation> </documentation>
</annotation> </annotation>
</attribute> </attribute>
<attribute name="fieldEditor" type="string">
<annotation>
<documentation>
Optional ID of the custom field-editor to represent this build-option in the project Properties dialog UI. If no custom field-editor ID is specified then the option will be represented by one of the built-in field-editors based on the option&apos;s &lt;code&gt;valueType&lt;/code&gt; attribute.
A custom field-editor needs to be registered, under the same ID, through the &lt;code&gt;org.eclipse.cdt.managedbuilder.ui.buildDefinitionsUI&lt;/code&gt; extension-point&apos;s &lt;code&gt;&amp;lt;fieldEditor&amp;gt;&lt;/code&gt; element.
</documentation>
<appInfo>
<meta.attribute kind="identifier" basedOn="org.eclipse.cdt.managedbuilder.ui.buildDefinitionsUI/fieldEditor/@id"/>
</appInfo>
</annotation>
</attribute>
<attribute name="fieldEditorExtraArgument" type="string">
<annotation>
<documentation>
An optional extra text string that is passed into the field-editor. Can be used to parameterize the field-editor instance.
</documentation>
</annotation>
</attribute>
</complexType> </complexType>
</element> </element>

View file

@ -22,7 +22,8 @@
<artifactId>tycho-surefire-plugin</artifactId> <artifactId>tycho-surefire-plugin</artifactId>
<version>${tycho-version}</version> <version>${tycho-version}</version>
<configuration> <configuration>
<useUIHarness>false</useUIHarness> <!-- Need UI harness for quick fix tests -->
<useUIHarness>true</useUIHarness>
<argLine>-Xms256m -Xmx512m -XX:MaxPermSize=256M</argLine> <argLine>-Xms256m -Xmx512m -XX:MaxPermSize=256M</argLine>
<includes> <includes>
<include>**/AutomatedIntegrationSuite.*</include> <include>**/AutomatedIntegrationSuite.*</include>

View file

@ -9,3 +9,4 @@ Fragment-Host: org.eclipse.cdt.core;bundle-version="[5.2.0,6.0.0)"
Bundle-Localization: plugin Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: J2SE-1.4 Bundle-RequiredExecutionEnvironment: J2SE-1.4
Eclipse-PlatformFilter: (osgi.os=win32) Eclipse-PlatformFilter: (osgi.os=win32)
Eclipse-BundleShape: dir

View file

@ -278,6 +278,20 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
public void projectClosedRemove(IProject project) { public void projectClosedRemove(IProject project) {
CProjectDescriptionStorageManager.getInstance().projectClosedRemove(project); CProjectDescriptionStorageManager.getInstance().projectClosedRemove(project);
disposeAssociatedListeners(project);
}
private void disposeAssociatedListeners(IProject project) {
List<ScannerInfoProviderProxy> proxyListeners = new ArrayList<ScannerInfoProviderProxy>();
for (ListenerDescriptor ldescriptor : fListeners) {
if (ldescriptor.fListener instanceof ScannerInfoProviderProxy)
proxyListeners.add((ScannerInfoProviderProxy) ldescriptor.fListener);
}
// avoid calling proxy.close() inside fListeners loop as it modifies the collection
for (ScannerInfoProviderProxy proxy : proxyListeners) {
if (project.equals(proxy.getProject()))
proxy.close();
}
} }
/** /**

View file

@ -90,11 +90,21 @@ public interface IIndexManager extends IPDOMManager {
public final static int UPDATE_CHECK_CONTENTS_HASH= 0x10; public final static int UPDATE_CHECK_CONTENTS_HASH= 0x10;
/** /**
* Include files that are otherwise would be excluded from the index. * Include files that are otherwise would be excluded from the index. This flag is sticky
* for the duration of the Eclipse session. If the files are later updated without this flag,
* they remain in the index.
* @since 5.3 * @since 5.3
*/ */
public final static int FORCE_INDEX_INCLUSION= 0x20; public final static int FORCE_INDEX_INCLUSION= 0x20;
/**
* Causes files previously included in the index due to FORCE_INDEX_INCLUSION to loose
* their index inclusion privilege. The files included only due to FORCE_INDEX_INCLUSION,
* will be removed from the index.
* @since 5.4
*/
public final static int RESET_INDEX_INCLUSION= 0x40;
/** /**
* Returns the index for the given project. * Returns the index for the given project.
* @param project the project to get the index for * @param project the project to get the index for

View file

@ -7,7 +7,7 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.astwriter; package org.eclipse.cdt.internal.core.dom.rewrite.astwriter;
@ -18,23 +18,18 @@ import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.ASTCommenter;
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap; import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
/** /**
* * ASTWriter main class. Generates source code from <code>IASTNode</code>.
* ASTWriter main class. Generates source code from <code>IASTNode</code>. Uses a * Uses a <code>hangeGeneratorWriterVisitor</code> to generate the code for the given nodes.
* <codeC>hangeGeneratorWriterVisitor</code> to generate the code for the given
* nodes.
* *
* @see ChangeGeneratorWriterVisitor * @see ChangeGeneratorWriterVisitor
* *
* @author Emanuel Graf * @author Emanuel Graf
*
*/ */
public class ASTWriter { public class ASTWriter {
private ChangeGeneratorWriterVisitor transformationVisitor; private ChangeGeneratorWriterVisitor transformationVisitor;
private ASTModificationStore modificationStore = new ASTModificationStore(); private ASTModificationStore modificationStore = new ASTModificationStore();
private String givenIndentation = ""; //$NON-NLS-1$ private String givenIndentation = ""; //$NON-NLS-1$
/** /**
* Creates a <code>ASTWriter</code>. * Creates a <code>ASTWriter</code>.
*/ */
@ -53,8 +48,7 @@ public class ASTWriter {
} }
/** /**
* * Generates the source code representing this node.
* Genereates the source code representing this node.
* *
* @param rootNode Node to write. * @param rootNode Node to write.
* @return A <code>String</code> representing the source code for the node. * @return A <code>String</code> representing the source code for the node.
@ -69,20 +63,22 @@ public class ASTWriter {
} }
/** /**
*
* Generates the source code representing this node including comments. * Generates the source code representing this node including comments.
* *
* @param rootNode Node to write. * @param rootNode Node to write.
* @param fileScope * @param fileScope
* @param commentMap Node Comment Map <code>ASTCommenter</code> * @param commentMap Node Comment Map <code>ASTCommenter</code>
* @return A <code>String</code> representing the source code for the node. * @return A <code>String</code> representing the source code for the node.
* @throws ProblemRuntimeException if the node or one of it's children is a <code>IASTProblemNode</code>. * @throws ProblemRuntimeException if the node or one of it's children is
* an <code>IASTProblemNode</code>.
* *
* @see ASTCommenter#getCommentedNodeMap(org.eclipse.cdt.core.dom.ast.IASTTranslationUnit) * @see ASTCommenter#getCommentedNodeMap(org.eclipse.cdt.core.dom.ast.IASTTranslationUnit)
*/ */
public String write(IASTNode rootNode, String fileScope, NodeCommentMap commentMap) throws ProblemRuntimeException { public String write(IASTNode rootNode, String fileScope, NodeCommentMap commentMap)
transformationVisitor = new ChangeGeneratorWriterVisitor(modificationStore, givenIndentation, fileScope, commentMap); throws ProblemRuntimeException {
if(rootNode != null){ transformationVisitor = new ChangeGeneratorWriterVisitor(modificationStore, givenIndentation,
fileScope, commentMap);
if (rootNode != null) {
rootNode.accept(transformationVisitor); rootNode.accept(transformationVisitor);
} }
String str = transformationVisitor.toString(); String str = transformationVisitor.toString();
@ -90,9 +86,7 @@ public class ASTWriter {
return str; return str;
} }
public void setModificationStore(ASTModificationStore modificationStore) { public void setModificationStore(ASTModificationStore modificationStore) {
this.modificationStore = modificationStore; this.modificationStore = modificationStore;
} }
} }

View file

@ -83,7 +83,6 @@ public class ASTWriterVisitor extends ASTVisitor {
scribe.setGivenIndentation(givenIndentation); scribe.setGivenIndentation(givenIndentation);
init(commentMap); init(commentMap);
this.commentMap = commentMap; this.commentMap = commentMap;
} }
private void init(NodeCommentMap commentMap) { private void init(NodeCommentMap commentMap) {
@ -100,13 +99,13 @@ public class ASTWriterVisitor extends ASTVisitor {
} }
@Override @Override
public String toString(){ public String toString() {
return scribe.toString(); return scribe.toString();
} }
@Override @Override
public int leave(IASTTranslationUnit tu) { public int leave(IASTTranslationUnit tu) {
for(IASTComment comment : commentMap.getFreestandingCommentsForNode(tu)) { for (IASTComment comment : commentMap.getFreestandingCommentsForNode(tu)) {
scribe.print(comment.getComment()); scribe.print(comment.getComment());
scribe.newLine(); scribe.newLine();
} }
@ -114,14 +113,12 @@ public class ASTWriterVisitor extends ASTVisitor {
} }
private void writeLeadingComments(IASTNode node) { private void writeLeadingComments(IASTNode node) {
for(IASTComment comment : getLeadingComments(node)) { for (IASTComment comment : getLeadingComments(node)) {
scribe.print(comment.getComment()); scribe.print(comment.getComment());
scribe.newLine(); scribe.newLine();
} }
} }
private ArrayList<IASTComment> getLeadingComments(IASTNode node) { private ArrayList<IASTComment> getLeadingComments(IASTNode node) {
ArrayList<IASTComment> leadingComments = commentMap.getLeadingCommentsForNode(node); ArrayList<IASTComment> leadingComments = commentMap.getLeadingCommentsForNode(node);
IASTNodeLocation[] locs = node.getNodeLocations(); IASTNodeLocation[] locs = node.getNodeLocations();
@ -139,7 +136,7 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(IASTName name) { public int visit(IASTName name) {
writeLeadingComments(name); writeLeadingComments(name);
if(!macroHandler.checkisMacroExpansionNode(name)) { if (!macroHandler.checkisMacroExpansionNode(name)) {
nameWriter.writeName(name); nameWriter.writeName(name);
} }
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;
@ -155,11 +152,12 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(IASTExpression expression) { public int visit(IASTExpression expression) {
writeLeadingComments(expression); writeLeadingComments(expression);
if(!macroHandler.checkisMacroExpansionNode(expression)) { if (!macroHandler.checkisMacroExpansionNode(expression)) {
if (expression instanceof IGNUASTCompoundStatementExpression) { if (expression instanceof IGNUASTCompoundStatementExpression) {
IGNUASTCompoundStatementExpression gnuCompStmtExp = (IGNUASTCompoundStatementExpression) expression; IGNUASTCompoundStatementExpression gnuCompStmtExp =
(IGNUASTCompoundStatementExpression) expression;
gnuCompStmtExp.getCompoundStatement().accept(this); gnuCompStmtExp.getCompoundStatement().accept(this);
}else { } else {
expWriter.writeExpression(expression); expWriter.writeExpression(expression);
} }
} }
@ -169,10 +167,11 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(IASTStatement statement) { public int visit(IASTStatement statement) {
writeLeadingComments(statement); writeLeadingComments(statement);
if(macroHandler.isStatementWithMixedLocation(statement) && !(statement instanceof IASTCompoundStatement)){ if (macroHandler.isStatementWithMixedLocation(statement) &&
!(statement instanceof IASTCompoundStatement)) {
return statementWriter.writeMixedStatement(statement); return statementWriter.writeMixedStatement(statement);
} }
if(macroHandler.checkisMacroExpansionNode(statement)) { if (macroHandler.checkisMacroExpansionNode(statement)) {
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;
} }
return statementWriter.writeStatement(statement, true); return statementWriter.writeStatement(statement, true);
@ -181,7 +180,7 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(IASTDeclaration declaration) { public int visit(IASTDeclaration declaration) {
writeLeadingComments(declaration); writeLeadingComments(declaration);
if(!macroHandler.checkisMacroExpansionNode(declaration)) { if (!macroHandler.checkisMacroExpansionNode(declaration)) {
declarationWriter.writeDeclaration(declaration); declarationWriter.writeDeclaration(declaration);
} }
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;
@ -190,7 +189,7 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(IASTDeclarator declarator) { public int visit(IASTDeclarator declarator) {
writeLeadingComments(declarator); writeLeadingComments(declarator);
if(!macroHandler.checkisMacroExpansionNode(declarator)) { if (!macroHandler.checkisMacroExpansionNode(declarator)) {
declaratorWriter.writeDeclarator(declarator); declaratorWriter.writeDeclarator(declarator);
} }
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;
@ -198,7 +197,7 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(IASTArrayModifier amod) { public int visit(IASTArrayModifier amod) {
if(!macroHandler.checkisMacroExpansionNode(amod)) { if (!macroHandler.checkisMacroExpansionNode(amod)) {
declaratorWriter.writeArrayModifier(amod); declaratorWriter.writeArrayModifier(amod);
} }
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;
@ -207,7 +206,7 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(IASTInitializer initializer) { public int visit(IASTInitializer initializer) {
writeLeadingComments(initializer); writeLeadingComments(initializer);
if(!macroHandler.checkisMacroExpansionNode(initializer)) { if (!macroHandler.checkisMacroExpansionNode(initializer)) {
initializerWriter.writeInitializer(initializer); initializerWriter.writeInitializer(initializer);
} }
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;
@ -216,11 +215,11 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(IASTParameterDeclaration parameterDeclaration) { public int visit(IASTParameterDeclaration parameterDeclaration) {
writeLeadingComments(parameterDeclaration); writeLeadingComments(parameterDeclaration);
if(!macroHandler.checkisMacroExpansionNode(parameterDeclaration)) { if (!macroHandler.checkisMacroExpansionNode(parameterDeclaration)) {
parameterDeclaration.getDeclSpecifier().accept(this); parameterDeclaration.getDeclSpecifier().accept(this);
IASTDeclarator declarator = getParameterDeclarator(parameterDeclaration); IASTDeclarator declarator = getParameterDeclarator(parameterDeclaration);
if(getParameterName(declarator).toString().length() != 0){ if (getParameterName(declarator).toString().length() != 0) {
scribe.printSpaces(1); scribe.printSpaces(1);
} }
declarator.accept(this); declarator.accept(this);
@ -232,15 +231,14 @@ public class ASTWriterVisitor extends ASTVisitor {
return declarator.getName(); return declarator.getName();
} }
protected IASTDeclarator getParameterDeclarator( protected IASTDeclarator getParameterDeclarator(IASTParameterDeclaration parameterDeclaration) {
IASTParameterDeclaration parameterDeclaration) {
return parameterDeclaration.getDeclarator(); return parameterDeclaration.getDeclarator();
} }
@Override @Override
public int visit(ICPPASTNamespaceDefinition namespace) { public int visit(ICPPASTNamespaceDefinition namespace) {
writeLeadingComments(namespace); writeLeadingComments(namespace);
if(!macroHandler.checkisMacroExpansionNode(namespace)) { if (!macroHandler.checkisMacroExpansionNode(namespace)) {
declarationWriter.writeDeclaration(namespace); declarationWriter.writeDeclaration(namespace);
} }
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;
@ -249,7 +247,7 @@ public class ASTWriterVisitor extends ASTVisitor {
@Override @Override
public int visit(ICPPASTTemplateParameter parameter) { public int visit(ICPPASTTemplateParameter parameter) {
writeLeadingComments(parameter); writeLeadingComments(parameter);
if(!macroHandler.checkisMacroExpansionNode(parameter)) { if (!macroHandler.checkisMacroExpansionNode(parameter)) {
tempParameterWriter.writeTemplateParameter(parameter); tempParameterWriter.writeTemplateParameter(parameter);
} }
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;

View file

@ -7,8 +7,8 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.astwriter; package org.eclipse.cdt.internal.core.dom.rewrite.astwriter;
@ -39,19 +39,15 @@ import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; import org.eclipse.cdt.internal.core.dom.parser.ASTQueries;
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap; import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
/** /**
*
* Generates source code of declaration nodes. The actual string operations are delegated * Generates source code of declaration nodes. The actual string operations are delegated
* to the <code>Scribe</code> class. * to the <code>Scribe</code> class.
* *
* @see Scribe * @see Scribe
* @see IASTDeclaration * @see IASTDeclaration
* @author Emanuel Graf IFS * @author Emanuel Graf IFS
*
*/ */
public class DeclarationWriter extends NodeWriter{ public class DeclarationWriter extends NodeWriter{
private static final String ASM_END = ")"; //$NON-NLS-1$ private static final String ASM_END = ")"; //$NON-NLS-1$
private static final String ASM_START = "asm("; //$NON-NLS-1$ private static final String ASM_START = "asm("; //$NON-NLS-1$
private static final String TEMPLATE_DECLARATION = "template<"; //$NON-NLS-1$ private static final String TEMPLATE_DECLARATION = "template<"; //$NON-NLS-1$
@ -101,12 +97,12 @@ public class DeclarationWriter extends NodeWriter{
writeVisibilityLabel((ICPPASTVisibilityLabel) declaration); writeVisibilityLabel((ICPPASTVisibilityLabel) declaration);
} }
if(hasTrailingComments(declaration)) { if (hasTrailingComments(declaration)) {
writeTrailingComments(declaration, addNewLine); writeTrailingComments(declaration, addNewLine);
}else if(addNewLine){ } else if (addNewLine) {
scribe.newLine(); scribe.newLine();
} }
if(hasFreestandingComments(declaration)){ if (hasFreestandingComments(declaration)) {
writeFreeStandingComments(declaration); writeFreeStandingComments(declaration);
} }
@ -144,7 +140,7 @@ public class DeclarationWriter extends NodeWriter{
private void writeUsingDeclaration(ICPPASTUsingDeclaration usingDeclaration) { private void writeUsingDeclaration(ICPPASTUsingDeclaration usingDeclaration) {
scribe.print(USING); scribe.print(USING);
if(usingDeclaration.isTypename()){ if (usingDeclaration.isTypename()) {
scribe.print(TYPENAME); scribe.print(TYPENAME);
} }
usingDeclaration.getName().accept(visitor); usingDeclaration.getName().accept(visitor);
@ -157,14 +153,14 @@ public class DeclarationWriter extends NodeWriter{
} }
protected void writeTemplateDeclaration(ICPPASTTemplateDeclaration templateDeclaration) { protected void writeTemplateDeclaration(ICPPASTTemplateDeclaration templateDeclaration) {
if(templateDeclaration.isExported()){ if (templateDeclaration.isExported()) {
scribe.print(EXPORT); scribe.print(EXPORT);
} }
scribe.print(TEMPLATE_DECLARATION); scribe.print(TEMPLATE_DECLARATION);
ICPPASTTemplateParameter[] paraDecls = templateDeclaration.getTemplateParameters(); ICPPASTTemplateParameter[] paraDecls = templateDeclaration.getTemplateParameters();
for(int i = 0; i < paraDecls.length; ++i) { for (int i = 0; i < paraDecls.length; ++i) {
paraDecls[i].accept(visitor); paraDecls[i].accept(visitor);
if(i + 1 < paraDecls.length) { if (i + 1 < paraDecls.length) {
scribe.print(','); scribe.print(',');
scribe.printSpaces(1); scribe.printSpaces(1);
} }
@ -174,7 +170,7 @@ public class DeclarationWriter extends NodeWriter{
templateDeclaration.getDeclaration().accept(visitor); templateDeclaration.getDeclaration().accept(visitor);
} }
protected void writeDeclaration(ICPPASTNamespaceDefinition declaration){ protected void writeDeclaration(ICPPASTNamespaceDefinition declaration) {
printSemicolon = true; printSemicolon = true;
writeNamespaceDefinition(declaration); writeNamespaceDefinition(declaration);
} }
@ -182,18 +178,18 @@ public class DeclarationWriter extends NodeWriter{
private void writeNamespaceDefinition(ICPPASTNamespaceDefinition namespaceDefinition) { private void writeNamespaceDefinition(ICPPASTNamespaceDefinition namespaceDefinition) {
scribe.print(NAMESPACE); scribe.print(NAMESPACE);
namespaceDefinition.getName().accept(visitor); namespaceDefinition.getName().accept(visitor);
if(!hasTrailingComments(namespaceDefinition.getName())) { if (!hasTrailingComments(namespaceDefinition.getName())) {
scribe.newLine(); scribe.newLine();
} }
scribe.printLBrace(); scribe.printLBrace();
scribe.newLine(); scribe.newLine();
writeDeclarationsInNamespace(namespaceDefinition, namespaceDefinition.getDeclarations()); writeDeclarationsInNamespace(namespaceDefinition, namespaceDefinition.getDeclarations());
if(hasFreestandingComments(namespaceDefinition)) { if (hasFreestandingComments(namespaceDefinition)) {
writeFreeStandingComments(namespaceDefinition); writeFreeStandingComments(namespaceDefinition);
} }
scribe.printRBrace(); scribe.printRBrace();
if(hasTrailingComments(namespaceDefinition)) { if (hasTrailingComments(namespaceDefinition)) {
writeTrailingComments(namespaceDefinition); writeTrailingComments(namespaceDefinition);
}else{ }else{
scribe.newLine(); scribe.newLine();
@ -220,7 +216,7 @@ public class DeclarationWriter extends NodeWriter{
scribe.printSpaces(1); scribe.printSpaces(1);
IASTDeclaration[] declarations = linkageSpecification.getDeclarations(); IASTDeclaration[] declarations = linkageSpecification.getDeclarations();
if(declarations.length > 1){ if (declarations.length > 1) {
scribe.printLBrace(); scribe.printLBrace();
scribe.decrementIndentationLevel(); scribe.decrementIndentationLevel();
scribe.newLine(); scribe.newLine();
@ -229,13 +225,13 @@ public class DeclarationWriter extends NodeWriter{
} }
scribe.printRBrace(); scribe.printRBrace();
scribe.incrementIndentationLevel(); scribe.incrementIndentationLevel();
} else if(declarations.length > 0) { } else if (declarations.length > 0) {
visitNodeIfNotNull(declarations[0]); visitNodeIfNotNull(declarations[0]);
} }
} }
private void writeExplicitTemplateInstantiation(ICPPASTExplicitTemplateInstantiation explicitTemplateInstantiation) { private void writeExplicitTemplateInstantiation(ICPPASTExplicitTemplateInstantiation explicitTemplateInstantiation) {
switch(explicitTemplateInstantiation.getModifier()){ switch(explicitTemplateInstantiation.getModifier()) {
case ICPPASTExplicitTemplateInstantiation.EXTERN: case ICPPASTExplicitTemplateInstantiation.EXTERN:
scribe.print(EXTERN); scribe.print(EXTERN);
break; break;
@ -259,7 +255,7 @@ public class DeclarationWriter extends NodeWriter{
} }
private void printSemicolon() { private void printSemicolon() {
if(printSemicolon) { if (printSemicolon) {
scribe.printSemicolon(); scribe.printSemicolon();
} }
} }
@ -269,7 +265,7 @@ public class DeclarationWriter extends NodeWriter{
declSpecifier.accept(visitor); declSpecifier.accept(visitor);
if (declSpecifier instanceof IASTSimpleDeclSpecifier) { if (declSpecifier instanceof IASTSimpleDeclSpecifier) {
IASTSimpleDeclSpecifier simDeclSpec = (IASTSimpleDeclSpecifier) declSpecifier; IASTSimpleDeclSpecifier simDeclSpec = (IASTSimpleDeclSpecifier) declSpecifier;
if(simDeclSpec.getType() != IASTSimpleDeclSpecifier.t_unspecified) { if (simDeclSpec.getType() != IASTSimpleDeclSpecifier.t_unspecified) {
scribe.printSpace(); scribe.printSpace();
} }
}else { }else {
@ -300,16 +296,16 @@ public class DeclarationWriter extends NodeWriter{
} }
} }
protected void writeCtorChainInitializer( protected void writeCtorChainInitializer(ICPPASTFunctionDefinition funcDec,
ICPPASTFunctionDefinition funcDec, ICPPASTConstructorChainInitializer[] ctorInitChain) { ICPPASTConstructorChainInitializer[] ctorInitChain) {
if(ctorInitChain.length != 0) { if (ctorInitChain.length != 0) {
scribe.newLine(); scribe.newLine();
scribe.print(':'); scribe.print(':');
} }
for(int i = 0; i < ctorInitChain.length; ++i) { for (int i = 0; i < ctorInitChain.length; ++i) {
ICPPASTConstructorChainInitializer initializer = ctorInitChain[i]; ICPPASTConstructorChainInitializer initializer = ctorInitChain[i];
initializer.accept(visitor); initializer.accept(visitor);
if(i+1 < ctorInitChain.length) { if (i + 1 < ctorInitChain.length) {
scribe.print(COMMA_SPACE); scribe.print(COMMA_SPACE);
} }
} }
@ -323,13 +319,13 @@ public class DeclarationWriter extends NodeWriter{
boolean noSpace = false; boolean noSpace = false;
if (declSpecifier instanceof IASTSimpleDeclSpecifier) { if (declSpecifier instanceof IASTSimpleDeclSpecifier) {
IASTSimpleDeclSpecifier simpleDeclSpecifier = (IASTSimpleDeclSpecifier) declSpecifier; IASTSimpleDeclSpecifier simpleDeclSpecifier = (IASTSimpleDeclSpecifier) declSpecifier;
if(simpleDeclSpecifier.getType() == IASTSimpleDeclSpecifier.t_unspecified) { if (simpleDeclSpecifier.getType() == IASTSimpleDeclSpecifier.t_unspecified) {
noSpace = true; noSpace = true;
} }
} }
if(decls.length > 0) { if (decls.length > 0) {
if(!noSpace) { if (!noSpace) {
scribe.printSpace(); scribe.printSpace();
} }
writeNodeList(decls); writeNodeList(decls);
@ -337,5 +333,4 @@ public class DeclarationWriter extends NodeWriter{
printSemicolon(); printSemicolon();
} }
} }

View file

@ -7,7 +7,7 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.astwriter; package org.eclipse.cdt.internal.core.dom.rewrite.astwriter;
@ -35,14 +35,12 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacroReferenceName;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
/** /**
*
* Recognizes nodes that are the result of an macro expansion and replaces them * Recognizes nodes that are the result of an macro expansion and replaces them
* with a suitable macro call. * with a suitable macro call.
* @author Emanuel Graf IFS
* *
* @author Emanuel Graf IFS
*/ */
public class MacroExpansionHandler { public class MacroExpansionHandler {
private int lastMacroExpOffset; private int lastMacroExpOffset;
private final Scribe scribe; private final Scribe scribe;
private IASTTranslationUnit tu; private IASTTranslationUnit tu;
@ -58,7 +56,7 @@ public class MacroExpansionHandler {
protected boolean isStatementWithMixedLocation(IASTStatement node) { protected boolean isStatementWithMixedLocation(IASTStatement node) {
IASTNodeLocation[] nodeLocations = getNodeLocations(node); IASTNodeLocation[] nodeLocations = getNodeLocations(node);
if(nodeLocations != null && nodeLocations.length > 1) { if (nodeLocations != null && nodeLocations.length > 1) {
for (IASTNodeLocation loc : nodeLocations) { for (IASTNodeLocation loc : nodeLocations) {
if (loc instanceof IASTMacroExpansionLocation) { if (loc instanceof IASTMacroExpansionLocation) {
return true; return true;
@ -70,7 +68,7 @@ public class MacroExpansionHandler {
protected boolean macroExpansionAlreadyPrinted(IASTNode node) { protected boolean macroExpansionAlreadyPrinted(IASTNode node) {
IASTNodeLocation[] locs = node.getNodeLocations(); IASTNodeLocation[] locs = node.getNodeLocations();
if(locs.length ==1) { if (locs.length ==1) {
if (locs[0] instanceof IASTMacroExpansionLocation) { if (locs[0] instanceof IASTMacroExpansionLocation) {
IASTMacroExpansionLocation macroNode = (IASTMacroExpansionLocation) locs[0]; IASTMacroExpansionLocation macroNode = (IASTMacroExpansionLocation) locs[0];
if (macroNode.asFileLocation().getNodeOffset() == lastMacroExpOffset) { if (macroNode.asFileLocation().getNodeOffset() == lastMacroExpOffset) {
@ -83,7 +81,7 @@ public class MacroExpansionHandler {
protected boolean checkisMacroExpansionNode(IASTNode node, boolean write) { protected boolean checkisMacroExpansionNode(IASTNode node, boolean write) {
IASTTranslationUnit unit = node.getTranslationUnit(); IASTTranslationUnit unit = node.getTranslationUnit();
if(tu == null || !tu.equals(unit)) { if (tu == null || !tu.equals(unit)) {
initEmptyMacros(unit); initEmptyMacros(unit);
} }
IASTNodeLocation[] locs = getNodeLocations(node); IASTNodeLocation[] locs = getNodeLocations(node);
@ -124,19 +122,19 @@ public class MacroExpansionHandler {
} }
private void handleEmptyMacroExpansion(IASTNode node) { private void handleEmptyMacroExpansion(IASTNode node) {
if(node.getTranslationUnit() == null)return; if (node.getTranslationUnit() == null)return;
String file = node.getContainingFilename(); String file = node.getContainingFilename();
List<IIndexName> exps = macroExpansion.get(file); List<IIndexName> exps = macroExpansion.get(file);
if(exps != null && !exps.isEmpty()) { if (exps != null && !exps.isEmpty()) {
IASTFileLocation fileLocation = getFileLocation(node); IASTFileLocation fileLocation = getFileLocation(node);
if(fileLocation != null) { if (fileLocation != null) {
int nOff = fileLocation.getNodeOffset(); int nOff = fileLocation.getNodeOffset();
for (IIndexName iIndexName : exps) { for (IIndexName iIndexName : exps) {
if (iIndexName instanceof PDOMMacroReferenceName) { if (iIndexName instanceof PDOMMacroReferenceName) {
PDOMMacroReferenceName mName = (PDOMMacroReferenceName) iIndexName; PDOMMacroReferenceName mName = (PDOMMacroReferenceName) iIndexName;
int eOff = mName.getFileLocation().getNodeOffset(); int eOff = mName.getFileLocation().getNodeOffset();
int eLength = mName.getFileLocation().getNodeLength(); int eLength = mName.getFileLocation().getNodeLength();
if(eOff < nOff && Math.abs((eOff+eLength-nOff)) < 3) { if (eOff < nOff && Math.abs((eOff+eLength-nOff)) < 3) {
scribe.print(mName.toString() + " "); //$NON-NLS-1$ scribe.print(mName.toString() + " "); //$NON-NLS-1$
} }
} }
@ -161,29 +159,30 @@ public class MacroExpansionHandler {
if (unit != null) { if (unit != null) {
tu = unit; tu = unit;
IIndex index = tu.getIndex(); IIndex index = tu.getIndex();
if(index != null) { if (index != null) {
macroExpansion = new TreeMap<String, List<IIndexName>>(); macroExpansion = new TreeMap<String, List<IIndexName>>();
IASTPreprocessorMacroDefinition[] md = tu.getMacroDefinitions(); IASTPreprocessorMacroDefinition[] md = tu.getMacroDefinitions();
TreeSet<String>paths = new TreeSet<String>(); TreeSet<String>paths = new TreeSet<String>();
for(IASTPreprocessorIncludeStatement is :tu.getIncludeDirectives()) { for (IASTPreprocessorIncludeStatement is :tu.getIncludeDirectives()) {
if(!is.isSystemInclude()) { if (!is.isSystemInclude()) {
paths.add(is.getContainingFilename()); paths.add(is.getContainingFilename());
} }
} }
paths.add(tu.getContainingFilename()); paths.add(tu.getContainingFilename());
for (IASTPreprocessorMacroDefinition iastPreprocessorMacroDefinition : md) { for (IASTPreprocessorMacroDefinition iastPreprocessorMacroDefinition : md) {
if(iastPreprocessorMacroDefinition.getExpansion().length() == 0) { if (iastPreprocessorMacroDefinition.getExpansion().length() == 0) {
try { try {
IIndexMacro[] macroBinding = index.findMacros(iastPreprocessorMacroDefinition.getName().toCharArray(), IndexFilter.ALL, null); IIndexMacro[] macroBinding = index.findMacros(iastPreprocessorMacroDefinition.getName().toCharArray(),
if(macroBinding.length > 0) { IndexFilter.ALL, null);
if (macroBinding.length > 0) {
IIndexName[] refs = index.findReferences(macroBinding[0]); IIndexName[] refs = index.findReferences(macroBinding[0]);
for (IIndexName iIndexName : refs) { for (IIndexName iIndexName : refs) {
String filename2 = iIndexName.getFileLocation().getFileName(); String filename2 = iIndexName.getFileLocation().getFileName();
List<IIndexName>fileList = macroExpansion.get(filename2); List<IIndexName>fileList = macroExpansion.get(filename2);
if (paths.contains(filename2)) { if (paths.contains(filename2)) {
if(fileList == null) { if (fileList == null) {
fileList = new ArrayList<IIndexName>(); fileList = new ArrayList<IIndexName>();
macroExpansion.put(filename2, fileList); macroExpansion.put(filename2, fileList);
} }
@ -196,14 +195,13 @@ public class MacroExpansionHandler {
} }
} }
} }
}else { } else {
macroExpansion = Collections.emptyMap(); macroExpansion = Collections.emptyMap();
} }
} }
} }
public void reset(){ public void reset() {
lastMacroExpOffset = -1; lastMacroExpOffset = -1;
} }
} }

View file

@ -7,8 +7,8 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.changegenerator; package org.eclipse.cdt.internal.core.dom.rewrite.changegenerator;
@ -55,8 +55,6 @@ import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.text.edits.TextEditGroup; import org.eclipse.text.edits.TextEditGroup;
public class ChangeGenerator extends ASTVisitor { public class ChangeGenerator extends ASTVisitor {
private final LinkedHashMap<String, Integer> sourceOffsets = new LinkedHashMap<String, Integer>(); private final LinkedHashMap<String, Integer> sourceOffsets = new LinkedHashMap<String, Integer>();
public LinkedHashMap<IASTNode, List<ASTModification>> modificationParent = new LinkedHashMap<IASTNode, List<ASTModification>>(); public LinkedHashMap<IASTNode, List<ASTModification>> modificationParent = new LinkedHashMap<IASTNode, List<ASTModification>>();
private final LinkedHashMap<IFile, MultiTextEdit> changes = new LinkedHashMap<IFile, MultiTextEdit>(); private final LinkedHashMap<IFile, MultiTextEdit> changes = new LinkedHashMap<IFile, MultiTextEdit>();
@ -67,37 +65,23 @@ public class ChangeGenerator extends ASTVisitor {
{ {
shouldVisitExpressions = true; shouldVisitExpressions = true;
shouldVisitStatements = true; shouldVisitStatements = true;
shouldVisitNames = true; shouldVisitNames = true;
shouldVisitDeclarations = true; shouldVisitDeclarations = true;
shouldVisitDeclSpecifiers = true; shouldVisitDeclSpecifiers = true;
shouldVisitDeclarators = true; shouldVisitDeclarators = true;
shouldVisitArrayModifiers= true; shouldVisitArrayModifiers= true;
shouldVisitInitializers = true; shouldVisitInitializers = true;
shouldVisitBaseSpecifiers = true; shouldVisitBaseSpecifiers = true;
shouldVisitNamespaces = true; shouldVisitNamespaces = true;
shouldVisitTemplateParameters = true; shouldVisitTemplateParameters = true;
shouldVisitParameterDeclarations = true; shouldVisitParameterDeclarations = true;
shouldVisitTranslationUnit = true; shouldVisitTranslationUnit = true;
} }
public ChangeGenerator(ASTModificationStore modificationStore, NodeCommentMap commentMap) { public ChangeGenerator(ASTModificationStore modificationStore, NodeCommentMap commentMap) {
this.modificationStore = modificationStore; this.modificationStore = modificationStore;
this.commentMap = commentMap; this.commentMap = commentMap;
} }
public void generateChange(IASTNode rootNode) throws ProblemRuntimeException { public void generateChange(IASTNode rootNode) throws ProblemRuntimeException {
@ -110,7 +94,6 @@ public class ChangeGenerator extends ASTVisitor {
initParentModList(); initParentModList();
rootNode.accept(pathProvider); rootNode.accept(pathProvider);
for (IFile currentFile : changes.keySet()) { for (IFile currentFile : changes.keySet()) {
TextFileChange subchange= ASTRewriteAnalyzer.createCTextFileChange(currentFile); TextFileChange subchange= ASTRewriteAnalyzer.createCTextFileChange(currentFile);
subchange.setEdit(changes.get(currentFile)); subchange.setEdit(changes.get(currentFile));
change.add(subchange); change.add(subchange);
@ -118,20 +101,19 @@ public class ChangeGenerator extends ASTVisitor {
} }
private void initParentModList() { private void initParentModList() {
ASTModificationMap rootModifications = modificationStore ASTModificationMap rootModifications = modificationStore.getRootModifications();
.getRootModifications();
if (rootModifications != null) { if (rootModifications != null) {
for (IASTNode modifiedNode : rootModifications.getModifiedNodes()) { for (IASTNode modifiedNode : rootModifications.getModifiedNodes()) {
List<ASTModification> modificationsForNode = rootModifications List<ASTModification> modificationsForNode = rootModifications.getModificationsForNode(modifiedNode);
.getModificationsForNode(modifiedNode);
IASTNode modifiedNodeParent = determineParentToBeRewritten(modifiedNode, modificationsForNode); IASTNode modifiedNodeParent = determineParentToBeRewritten(modifiedNode, modificationsForNode);
List<ASTModification> list = modificationParent.get(modifiedNodeParent != null ? modifiedNodeParent : modifiedNode); List<ASTModification> list = modificationParent.get(modifiedNodeParent != null ?
if(list != null){ modifiedNodeParent : modifiedNode);
if (list != null) {
list.addAll(modificationsForNode); list.addAll(modificationsForNode);
}else{ } else {
List<ASTModification> modifiableList = new ArrayList<ASTModification>(modificationsForNode); List<ASTModification> modifiableList = new ArrayList<ASTModification>(modificationsForNode);
modificationParent.put(modifiedNodeParent != null ? modifiedNodeParent : modifiedNode, modificationParent.put(modifiedNodeParent != null ?
modifiableList); modifiedNodeParent : modifiedNode, modifiableList);
} }
} }
} }
@ -139,8 +121,8 @@ public class ChangeGenerator extends ASTVisitor {
private IASTNode determineParentToBeRewritten(IASTNode modifiedNode, List<ASTModification> modificationsForNode) { private IASTNode determineParentToBeRewritten(IASTNode modifiedNode, List<ASTModification> modificationsForNode) {
IASTNode modifiedNodeParent = modifiedNode; IASTNode modifiedNodeParent = modifiedNode;
for(ASTModification currentModification : modificationsForNode){ for (ASTModification currentModification : modificationsForNode) {
if(currentModification.getKind() == ASTModification.ModificationKind.REPLACE){ if (currentModification.getKind() == ASTModification.ModificationKind.REPLACE) {
modifiedNodeParent = modifiedNode.getParent(); modifiedNodeParent = modifiedNode.getParent();
break; break;
} }
@ -152,21 +134,20 @@ public class ChangeGenerator extends ASTVisitor {
@Override @Override
public int visit(IASTTranslationUnit translationUnit) { public int visit(IASTTranslationUnit translationUnit) {
if (hasChangedChild(translationUnit)) { if (hasChangedChild(translationUnit)) {
synthTreatment(translationUnit); synthTreatment(translationUnit);
} }
IASTFileLocation location = getFileLocationOfEmptyTranslationUnit(translationUnit); IASTFileLocation location = getFileLocationOfEmptyTranslationUnit(translationUnit);
sourceOffsets.put(location.getFileName(), sourceOffsets.put(location.getFileName(), Integer.valueOf(location.getNodeOffset()));
Integer.valueOf(location.getNodeOffset()));
return super.visit(translationUnit); return super.visit(translationUnit);
} }
/** /**
* This is a Workaround for a known but not jet solved Problem in IASTNode. If you get the FileFocation of a translationUnit * This is a workaround for a known but not jet solved problem in IASTNode. If you get
* that was built on an empty file you will get null because there it explicitly returns null if the index and length is 0. * the FileFocation of a translation unit that was built on an empty file you will get null
* To get to the Filename and other information, the location is never the less needed. * because there it explicitly returns null if the index and length is 0.
* To get to the filename and other information, the location is never the less needed.
* @param node * @param node
* @return a hopefully "unnull" FileLocation * @return a hopefully non-{@code null} FileLocation
*/ */
public IASTFileLocation getFileLocationOfEmptyTranslationUnit(IASTNode node) { public IASTFileLocation getFileLocationOfEmptyTranslationUnit(IASTNode node) {
IASTFileLocation fileLocation = node.getFileLocation(); IASTFileLocation fileLocation = node.getFileLocation();
@ -175,7 +156,7 @@ public class ChangeGenerator extends ASTVisitor {
if (lr != null) { if (lr != null) {
fileLocation = lr.getMappedFileLocation(0, 0); fileLocation = lr.getMappedFileLocation(0, 0);
} else { } else {
// support for old location map // Support for old location map
fileLocation = node.getTranslationUnit().flattenLocationsToFile(node.getNodeLocations()); fileLocation = node.getTranslationUnit().flattenLocationsToFile(node.getNodeLocations());
} }
} }
@ -184,14 +165,11 @@ public class ChangeGenerator extends ASTVisitor {
@Override @Override
public int leave(IASTTranslationUnit tu) { public int leave(IASTTranslationUnit tu) {
return super.leave(tu); return super.leave(tu);
} }
private int getOffsetForNodeFile(IASTNode rootNode) { private int getOffsetForNodeFile(IASTNode rootNode) {
Integer offset = sourceOffsets.get(rootNode.getFileLocation().getFileName());
Integer offset = sourceOffsets.get(rootNode.getFileLocation()
.getFileName());
return offset == null ? 0 : offset.intValue(); return offset == null ? 0 : offset.intValue();
} }
@ -217,10 +195,8 @@ public class ChangeGenerator extends ASTVisitor {
createChange(synthNode, synthSource); createChange(synthNode, synthSource);
int newOffset = synthNode.getFileLocation().getNodeOffset() int newOffset = synthNode.getFileLocation().getNodeOffset() + synthNode.getFileLocation().getNodeLength();
+ synthNode.getFileLocation().getNodeLength();
sourceOffsets.put(synthNode.getFileLocation().getFileName(), Integer.valueOf(newOffset)); sourceOffsets.put(synthNode.getFileLocation().getFileName(), Integer.valueOf(newOffset));
} }
private void synthTreatment(IASTTranslationUnit synthTU) { private void synthTreatment(IASTTranslationUnit synthTU) {
@ -228,9 +204,8 @@ public class ChangeGenerator extends ASTVisitor {
synthWriter.setModificationStore(modificationStore); synthWriter.setModificationStore(modificationStore);
for (ASTModification modification : modificationParent.get(synthTU)) { for (ASTModification modification : modificationParent.get(synthTU)) {
IASTFileLocation targetLocation; IASTFileLocation targetLocation =
getFileLocationOfEmptyTranslationUnit(modification.getTargetNode());
targetLocation = getFileLocationOfEmptyTranslationUnit(modification.getTargetNode());
String currentFile = targetLocation.getFileName(); String currentFile = targetLocation.getFileName();
IPath implPath = new Path(currentFile); IPath implPath = new Path(currentFile);
IFile relevantFile= ResourceLookup.selectFileForLocation(implPath, null); IFile relevantFile= ResourceLookup.selectFileForLocation(implPath, null);
@ -256,14 +231,16 @@ public class ChangeGenerator extends ASTVisitor {
newNodeCode)); newNodeCode));
break; break;
case APPEND_CHILD: case APPEND_CHILD:
if(modification.getTargetNode() instanceof IASTTranslationUnit && ((IASTTranslationUnit)modification.getTargetNode()).getDeclarations().length > 0) { if (modification.getTargetNode() instanceof IASTTranslationUnit &&
((IASTTranslationUnit)modification.getTargetNode()).getDeclarations().length > 0) {
IASTTranslationUnit tu = (IASTTranslationUnit)modification.getTargetNode(); IASTTranslationUnit tu = (IASTTranslationUnit)modification.getTargetNode();
IASTDeclaration lastDecl = tu.getDeclarations()[tu.getDeclarations().length -1]; IASTDeclaration lastDecl = tu.getDeclarations()[tu.getDeclarations().length -1];
targetLocation = lastDecl.getFileLocation(); targetLocation = lastDecl.getFileLocation();
} }
String lineDelimiter = FileHelper.determineLineDelimiter(FileHelper.getIFilefromIASTNode(modification.getTargetNode())); String lineDelimiter = FileHelper.determineLineDelimiter(
edit.addChild(new InsertEdit(targetLocation.getNodeOffset() FileHelper.getIFilefromIASTNode(modification.getTargetNode()));
+ targetLocation.getNodeLength(),lineDelimiter + lineDelimiter + newNodeCode)); edit.addChild(new InsertEdit(targetLocation.getNodeOffset() + targetLocation.getNodeLength(),
lineDelimiter + lineDelimiter + newNodeCode));
break; break;
} }
} }
@ -302,15 +279,15 @@ public class ChangeGenerator extends ASTVisitor {
int nodeLength = node.getFileLocation().getNodeLength(); int nodeLength = node.getFileLocation().getNodeLength();
ArrayList<IASTComment> comments = commentMap.getAllCommentsForNode(node); ArrayList<IASTComment> comments = commentMap.getAllCommentsForNode(node);
if(!comments.isEmpty()) { if (!comments.isEmpty()) {
int startOffset = nodeOffset; int startOffset = nodeOffset;
int endOffset = nodeOffset + nodeLength; int endOffset = nodeOffset + nodeLength;
for(IASTComment comment : comments) { for (IASTComment comment : comments) {
IASTFileLocation commentLocation = comment.getFileLocation(); IASTFileLocation commentLocation = comment.getFileLocation();
if(commentLocation.getNodeOffset() < startOffset) { if (commentLocation.getNodeOffset() < startOffset) {
startOffset = commentLocation.getNodeOffset(); startOffset = commentLocation.getNodeOffset();
} }
if(commentLocation.getNodeOffset() + commentLocation.getNodeLength() >= endOffset) { if (commentLocation.getNodeOffset() + commentLocation.getNodeLength() >= endOffset) {
endOffset = commentLocation.getNodeOffset() + commentLocation.getNodeLength(); endOffset = commentLocation.getNodeOffset() + commentLocation.getNodeLength();
} }
} }
@ -323,11 +300,11 @@ public class ChangeGenerator extends ASTVisitor {
int nodeOffset = node.getFileLocation().getNodeOffset(); int nodeOffset = node.getFileLocation().getNodeOffset();
ArrayList<IASTComment> comments = commentMap.getAllCommentsForNode(node); ArrayList<IASTComment> comments = commentMap.getAllCommentsForNode(node);
if(!comments.isEmpty()) { if (!comments.isEmpty()) {
int startOffset = nodeOffset; int startOffset = nodeOffset;
for(IASTComment comment : comments) { for (IASTComment comment : comments) {
IASTFileLocation commentLocation = comment.getFileLocation(); IASTFileLocation commentLocation = comment.getFileLocation();
if(commentLocation.getNodeOffset() < startOffset) { if (commentLocation.getNodeOffset() < startOffset) {
startOffset = commentLocation.getNodeOffset(); startOffset = commentLocation.getNodeOffset();
} }
} }
@ -338,16 +315,13 @@ public class ChangeGenerator extends ASTVisitor {
private String getIndent(IASTNode nextNode) { private String getIndent(IASTNode nextNode) {
IASTFileLocation fileLocation = nextNode.getFileLocation(); IASTFileLocation fileLocation = nextNode.getFileLocation();
int length = fileLocation.getNodeOffset() int length = fileLocation.getNodeOffset() - getOffsetForNodeFile(nextNode);
- getOffsetForNodeFile(nextNode);
String originalSource = FileContentHelper.getContent(FileHelper String originalSource = FileContentHelper.getContent(FileHelper.getIFilefromIASTNode(nextNode),
.getIFilefromIASTNode(nextNode),
getOffsetForNodeFile(nextNode), length); getOffsetForNodeFile(nextNode), length);
StringBuilder indent = new StringBuilder(originalSource); StringBuilder indent = new StringBuilder(originalSource);
indent.reverse(); indent.reverse();
String lastline = indent String lastline = indent.substring(0, Math.max(indent.indexOf("\n"), 0)); //$NON-NLS-1$
.substring(0, Math.max(indent.indexOf("\n"), 0)); //$NON-NLS-1$
if (lastline.trim().length() == 0) { if (lastline.trim().length() == 0) {
return lastline; return lastline;
} }
@ -355,11 +329,9 @@ public class ChangeGenerator extends ASTVisitor {
} }
private boolean hasChangedChild(IASTNode parent) { private boolean hasChangedChild(IASTNode parent) {
return modificationParent.containsKey(parent); return modificationParent.containsKey(parent);
} }
@Override @Override
public int visit(IASTDeclarator declarator) { public int visit(IASTDeclarator declarator) {
if (hasChangedChild(declarator)) { if (hasChangedChild(declarator)) {
@ -378,10 +350,9 @@ public class ChangeGenerator extends ASTVisitor {
return super.visit(mod); return super.visit(mod);
} }
@Override @Override
public int visit(ICPPASTNamespaceDefinition namespaceDefinition) { public int visit(ICPPASTNamespaceDefinition namespaceDefinition) {
if(hasChangedChild(namespaceDefinition)){ if (hasChangedChild(namespaceDefinition)) {
synthTreatment(namespaceDefinition); synthTreatment(namespaceDefinition);
return ASTVisitor.PROCESS_SKIP; return ASTVisitor.PROCESS_SKIP;
} }
@ -443,7 +414,6 @@ public class ChangeGenerator extends ASTVisitor {
} }
class CodeComparer { class CodeComparer {
private final StringBuilder originalCode; private final StringBuilder originalCode;
private final StringBuilder synthCode; private final StringBuilder synthCode;
private int lastCommonInSynthStart; private int lastCommonInSynthStart;
@ -457,37 +427,37 @@ public class ChangeGenerator extends ASTVisitor {
calculatePositions(); calculatePositions();
} }
private void calculatePositions(){ private void calculatePositions() {
lastCommonInSynthStart = calcLastCommonPositionInSynthCode(); lastCommonInSynthStart = calcLastCommonPositionInSynthCode();
lastCommonInOriginalStart = calcLastCommonPositionInOriginalCode(); lastCommonInOriginalStart = calcLastCommonPositionInOriginalCode();
firstCommonInSynthEnd = calcFirstPositionOfCommonEndInSynthCode(lastCommonInSynthStart, lastCommonInOriginalStart); firstCommonInSynthEnd =
firstCommonInOriginalEnd = calcFirstPositionOfCommonEndInOriginalCode(lastCommonInOriginalStart, lastCommonInSynthStart); calcFirstPositionOfCommonEndInSynthCode(lastCommonInSynthStart, lastCommonInOriginalStart);
firstCommonInOriginalEnd =
calcFirstPositionOfCommonEndInOriginalCode(lastCommonInOriginalStart, lastCommonInSynthStart);
trimTrailingNewlines(); trimTrailingNewlines();
} }
private void trimTrailingNewlines() { private void trimTrailingNewlines() {
int prevOrigEnd = firstCommonInOriginalEnd - 1; int prevOrigEnd = firstCommonInOriginalEnd - 1;
while( prevOrigEnd > lastCommonInOriginalStart while (prevOrigEnd > lastCommonInOriginalStart && prevOrigEnd > -1 &&
&& prevOrigEnd > -1 isUninterresting(originalCode, prevOrigEnd)) {
&& isUninterresting(originalCode, prevOrigEnd)){
firstCommonInOriginalEnd = prevOrigEnd; firstCommonInOriginalEnd = prevOrigEnd;
prevOrigEnd--; prevOrigEnd--;
} }
while(firstCommonInOriginalEnd > 0 && firstCommonInOriginalEnd +1 < originalCode.length() && (originalCode.charAt(firstCommonInOriginalEnd) == ' ' || originalCode.charAt(firstCommonInOriginalEnd) == '\t')){ while (firstCommonInOriginalEnd > 0 && firstCommonInOriginalEnd + 1 < originalCode.length() &&
(originalCode.charAt(firstCommonInOriginalEnd) == ' ' || originalCode.charAt(firstCommonInOriginalEnd) == '\t')) {
firstCommonInOriginalEnd++; firstCommonInOriginalEnd++;
} }
int prevSynthEnd = firstCommonInSynthEnd - 1; int prevSynthEnd = firstCommonInSynthEnd - 1;
while( prevSynthEnd > lastCommonInSynthStart while (prevSynthEnd > lastCommonInSynthStart && prevSynthEnd > -1 &&
&& prevSynthEnd > -1 isUninterresting(synthCode, prevSynthEnd)) {
&& isUninterresting(synthCode, prevSynthEnd)){
firstCommonInSynthEnd = prevSynthEnd; firstCommonInSynthEnd = prevSynthEnd;
prevSynthEnd--; prevSynthEnd--;
} }
while(firstCommonInSynthEnd > 0 && firstCommonInSynthEnd +1< synthCode.length() && (synthCode.charAt(firstCommonInSynthEnd) == ' ' || synthCode.charAt(firstCommonInSynthEnd) == '\t')){ while (firstCommonInSynthEnd > 0 && firstCommonInSynthEnd + 1 < synthCode.length() &&
(synthCode.charAt(firstCommonInSynthEnd) == ' ' || synthCode.charAt(firstCommonInSynthEnd) == '\t')) {
firstCommonInSynthEnd++; firstCommonInSynthEnd++;
} }
} }
@ -508,7 +478,6 @@ public class ChangeGenerator extends ASTVisitor {
return firstCommonInSynthEnd; return firstCommonInSynthEnd;
} }
public int calcLastCommonPositionInSynthCode() { public int calcLastCommonPositionInSynthCode() {
return findLastCommonPosition(synthCode, originalCode); return findLastCommonPosition(synthCode, originalCode);
} }
@ -517,48 +486,41 @@ public class ChangeGenerator extends ASTVisitor {
return findLastCommonPosition(originalCode, synthCode); return findLastCommonPosition(originalCode, synthCode);
} }
private int calcFirstPositionOfCommonEndInOriginalCode(int originalLimit, int synthLimit) { private int calcFirstPositionOfCommonEndInOriginalCode(int originalLimit, int synthLimit) {
StringBuilder reverseOriginalCode = new StringBuilder(originalCode).reverse();
StringBuilder reverseOriginalCode = new StringBuilder(originalCode) StringBuilder reverseSynthCode = new StringBuilder(synthCode).reverse();
.reverse();
StringBuilder reverseSynthCode = new StringBuilder(synthCode)
.reverse();
int lastCommonPosition = findLastCommonPosition(reverseOriginalCode, reverseSynthCode, int lastCommonPosition = findLastCommonPosition(reverseOriginalCode, reverseSynthCode,
reverseOriginalCode.length() - originalLimit - 1, reverseSynthCode.length() - synthLimit - 1); reverseOriginalCode.length() - originalLimit - 1,
reverseSynthCode.length() - synthLimit - 1);
if (lastCommonPosition < 0 if (lastCommonPosition < 0 || lastCommonPosition >= originalCode.length()) {
|| lastCommonPosition >= originalCode.length()) {
return -1; return -1;
} }
return originalCode.length() - lastCommonPosition -1; return originalCode.length() - lastCommonPosition - 1;
} }
private int calcFirstPositionOfCommonEndInSynthCode(int synthLimit, int originalLimit) { private int calcFirstPositionOfCommonEndInSynthCode(int synthLimit, int originalLimit) {
StringBuilder reverseOriginalCode = new StringBuilder(originalCode) StringBuilder reverseOriginalCode = new StringBuilder(originalCode).reverse();
.reverse(); StringBuilder reverseSynthCode = new StringBuilder(synthCode).reverse();
StringBuilder reverseSynthCode = new StringBuilder(synthCode)
.reverse();
int lastCommonPosition = findLastCommonPosition(reverseSynthCode, reverseOriginalCode, int lastCommonPosition = findLastCommonPosition(reverseSynthCode, reverseOriginalCode,
reverseSynthCode.length() - synthLimit -1, reverseOriginalCode.length() - originalLimit -1); reverseSynthCode.length() - synthLimit - 1,
reverseOriginalCode.length() - originalLimit - 1);
if (lastCommonPosition < 0 if (lastCommonPosition < 0 || lastCommonPosition >= synthCode.length()) {
|| lastCommonPosition >= synthCode.length()) {
return -1; return -1;
} }
return synthCode.length() - lastCommonPosition - 1; return synthCode.length() - lastCommonPosition - 1;
} }
private int findLastCommonPosition(StringBuilder first, StringBuilder second) {
private int findLastCommonPosition(StringBuilder first, StringBuilder second){
return findLastCommonPosition(first, second, first.length(), second.length()); return findLastCommonPosition(first, second, first.length(), second.length());
} }
private int findLastCommonPosition(StringBuilder first, StringBuilder second, int firstLimit,
private int findLastCommonPosition(StringBuilder first, StringBuilder second, int firstLimit, int secondLimit){ int secondLimit) {
int firstIndex = -1; int firstIndex = -1;
int secondIndex = -1; int secondIndex = -1;
int lastCommonIndex = -1; int lastCommonIndex = -1;
@ -567,11 +529,8 @@ public class ChangeGenerator extends ASTVisitor {
lastCommonIndex = firstIndex; lastCommonIndex = firstIndex;
firstIndex = nextInterrestingPosition(first, firstIndex); firstIndex = nextInterrestingPosition(first, firstIndex);
secondIndex = nextInterrestingPosition(second, secondIndex); secondIndex = nextInterrestingPosition(second, secondIndex);
} while (firstIndex > -1 } while (firstIndex > -1 && firstIndex <= firstLimit && secondIndex > -1 &&
&& firstIndex <= firstLimit secondIndex <= secondLimit && first.charAt(firstIndex) == second.charAt(secondIndex));
&& secondIndex > -1
&& secondIndex <= secondLimit
&& first.charAt(firstIndex) == second.charAt(secondIndex));
return lastCommonIndex; return lastCommonIndex;
} }
@ -600,63 +559,52 @@ public class ChangeGenerator extends ASTVisitor {
protected void createChange(MultiTextEdit edit, IASTNode changedNode) { protected void createChange(MultiTextEdit edit, IASTNode changedNode) {
int changeOffset = getOffsetIncludingComments(changedNode); int changeOffset = getOffsetIncludingComments(changedNode);
TextEditGroup editGroup = new TextEditGroup(Messages.ChangeGenerator_group); TextEditGroup editGroup = new TextEditGroup(Messages.ChangeGenerator_group);
for (ASTModification currentModification : modificationParent for (ASTModification currentModification : modificationParent.get(changedNode)) {
.get(changedNode)) {
if (currentModification.getAssociatedEditGroup() != null) { if (currentModification.getAssociatedEditGroup() != null) {
editGroup = currentModification.getAssociatedEditGroup(); editGroup = currentModification.getAssociatedEditGroup();
edit.addChildren(editGroup.getTextEdits()); edit.addChildren(editGroup.getTextEdits());
break; break;
} }
} }
createChange(edit, changeOffset); createChange(edit, changeOffset);
} }
private void createChange(MultiTextEdit edit, int changeOffset) { private void createChange(MultiTextEdit edit, int changeOffset) {
int i = (firstCommonInSynthEnd >= 0 ?
int i = (firstCommonInSynthEnd >= 0 ? firstCommonInOriginalEnd firstCommonInOriginalEnd : originalCode.length()) - lastCommonInOriginalStart;
: originalCode.length())
- lastCommonInOriginalStart;
if (i <= 0) { if (i <= 0) {
String insertCode = synthCode.substring( String insertCode = synthCode.substring(lastCommonInSynthStart,
lastCommonInSynthStart, firstCommonInSynthEnd); firstCommonInSynthEnd);
InsertEdit iEdit = new InsertEdit(changeOffset InsertEdit iEdit = new InsertEdit(changeOffset + lastCommonInOriginalStart,
+ lastCommonInOriginalStart, insertCode); insertCode);
edit.addChild(iEdit); edit.addChild(iEdit);
} else if ((firstCommonInSynthEnd >= 0 ? firstCommonInSynthEnd } else if ((firstCommonInSynthEnd >= 0 ?
: synthCode.length()) firstCommonInSynthEnd : synthCode.length()) - lastCommonInSynthStart <= 0) {
- lastCommonInSynthStart <= 0) {
int correction = 0; int correction = 0;
if (lastCommonInSynthStart > firstCommonInSynthEnd) { if (lastCommonInSynthStart > firstCommonInSynthEnd) {
correction = lastCommonInSynthStart correction = lastCommonInSynthStart - firstCommonInSynthEnd;
- firstCommonInSynthEnd;
} }
DeleteEdit dEdit = new DeleteEdit(changeOffset DeleteEdit dEdit = new DeleteEdit(changeOffset + lastCommonInOriginalStart,
+ lastCommonInOriginalStart, firstCommonInOriginalEnd - lastCommonInOriginalStart + correction);
firstCommonInOriginalEnd
- lastCommonInOriginalStart + correction);
edit.addChild(dEdit); edit.addChild(dEdit);
} else { } else {
String replacementCode = getReplacementCode( String replacementCode = getReplacementCode(lastCommonInSynthStart,
lastCommonInSynthStart, firstCommonInSynthEnd); firstCommonInSynthEnd);
ReplaceEdit rEdit = new ReplaceEdit( ReplaceEdit rEdit = new ReplaceEdit(
changeOffset changeOffset + Math.max(lastCommonInOriginalStart, 0),
+ Math.max(lastCommonInOriginalStart, 0), (firstCommonInOriginalEnd >= 0 ?
(firstCommonInOriginalEnd >= 0 ? firstCommonInOriginalEnd firstCommonInOriginalEnd :
: originalCode.length()) originalCode.length()) - Math.max(lastCommonInOriginalStart, 0),
- Math.max(lastCommonInOriginalStart, 0),
replacementCode); replacementCode);
edit.addChild(rEdit); edit.addChild(rEdit);
} }
} }
private String getReplacementCode(int lastCommonPositionInSynth, private String getReplacementCode(int lastCommonPositionInSynth, int firstOfCommonEndInSynth) {
int firstOfCommonEndInSynth) {
int replacementStart = Math.max(lastCommonPositionInSynth, 0); int replacementStart = Math.max(lastCommonPositionInSynth, 0);
int replacementEnd = (firstOfCommonEndInSynth >= 0 ? firstOfCommonEndInSynth int replacementEnd = (firstOfCommonEndInSynth >= 0 ?
: synthCode.length()); firstOfCommonEndInSynth : synthCode.length());
if (replacementStart < replacementEnd) { if (replacementStart < replacementEnd) {
return synthCode.substring(replacementStart, replacementEnd); return synthCode.substring(replacementStart, replacementEnd);
} }

View file

@ -7,8 +7,8 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
* Markus Schorn (Wind River Systems) * Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.changegenerator; package org.eclipse.cdt.internal.core.dom.rewrite.changegenerator;
@ -37,15 +37,12 @@ import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ASTWriterVisitor;
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap; import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
/** /**
*
* Visits the nodes in consideration of {@link ASTModification}s. * Visits the nodes in consideration of {@link ASTModification}s.
* *
* @since 5.0 * @since 5.0
* @author Emanuel Graf IFS * @author Emanuel Graf IFS
*
*/ */
public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor { public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
private static final String DEFAULT_INDENTATION = ""; //$NON-NLS-1$ private static final String DEFAULT_INDENTATION = ""; //$NON-NLS-1$
private final ASTModificationStore modificationStore; private final ASTModificationStore modificationStore;
private final String fileScope; private final String fileScope;
@ -74,15 +71,14 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
shouldVisitProblems = delegateVisitor.shouldVisitProblems; shouldVisitProblems = delegateVisitor.shouldVisitProblems;
shouldVisitTypeIds = delegateVisitor.shouldVisitTypeIds; shouldVisitTypeIds = delegateVisitor.shouldVisitTypeIds;
shouldVisitArrayModifiers= delegateVisitor.shouldVisitArrayModifiers; shouldVisitArrayModifiers= delegateVisitor.shouldVisitArrayModifiers;
} }
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, NodeCommentMap nodeMap) { public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, NodeCommentMap nodeMap) {
this(modStore, DEFAULT_INDENTATION, null, nodeMap); this(modStore, DEFAULT_INDENTATION, null, nodeMap);
} }
public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, public ChangeGeneratorWriterVisitor(ASTModificationStore modStore, String givenIndentation,
String givenIndentation, String fileScope, NodeCommentMap commentMap) { String fileScope, NodeCommentMap commentMap) {
super(givenIndentation, commentMap); super(givenIndentation, commentMap);
this.modificationStore = modStore; this.modificationStore = modStore;
this.fileScope = fileScope; this.fileScope = fileScope;
@ -98,13 +94,12 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
} }
@Override @Override
protected IASTDeclarator getParameterDeclarator( protected IASTDeclarator getParameterDeclarator(IASTParameterDeclaration parameterDeclaration) {
IASTParameterDeclaration parameterDeclaration) {
IASTDeclarator newDecl = parameterDeclaration.getDeclarator(); IASTDeclarator newDecl = parameterDeclaration.getDeclarator();
if(stack.getModifiedNodes().contains(newDecl)){ if (stack.getModifiedNodes().contains(newDecl)) {
for(ASTModification currentModification : stack.getModificationsForNode(newDecl)){ for (ASTModification currentModification : stack.getModificationsForNode(newDecl)) {
if(currentModification.getKind() == ASTModification.ModificationKind.REPLACE && currentModification.getTargetNode() == parameterDeclaration){ if (currentModification.getKind() == ASTModification.ModificationKind.REPLACE &&
currentModification.getTargetNode() == parameterDeclaration) {
newDecl = (IASTDeclarator) currentModification.getNewNode(); newDecl = (IASTDeclarator) currentModification.getNewNode();
} }
} }
@ -115,9 +110,10 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
@Override @Override
protected IASTName getParameterName(IASTDeclarator declarator) { protected IASTName getParameterName(IASTDeclarator declarator) {
IASTName newName = declarator.getName(); IASTName newName = declarator.getName();
if(stack.getModifiedNodes().contains(newName)){ if (stack.getModifiedNodes().contains(newName)) {
for(ASTModification currentModification : stack.getModificationsForNode(newName)){ for (ASTModification currentModification : stack.getModificationsForNode(newName)) {
if(currentModification.getKind() == ASTModification.ModificationKind.REPLACE && currentModification.getTargetNode() == newName){ if (currentModification.getKind() == ASTModification.ModificationKind.REPLACE &&
currentModification.getTargetNode() == newName) {
newName = (IASTName) currentModification.getNewNode(); newName = (IASTName) currentModification.getNewNode();
} }
} }
@ -329,14 +325,12 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
@Override @Override
public int visit(IASTTranslationUnit tu) { public int visit(IASTTranslationUnit tu) {
ASTModificationHelper helper = new ASTModificationHelper( ASTModificationHelper helper = new ASTModificationHelper(stack);
stack); IASTDeclaration[] declarations = helper.createModifiedChildArray(tu, tu.getDeclarations(),
IASTDeclaration.class, commentMap);
IASTDeclaration[] declarations = helper.createModifiedChildArray(tu, tu.getDeclarations(), IASTDeclaration.class, commentMap);
for (IASTDeclaration currentDeclaration : declarations) { for (IASTDeclaration currentDeclaration : declarations) {
currentDeclaration.accept(this); currentDeclaration.accept(this);
} }
return PROCESS_SKIP; return PROCESS_SKIP;
} }
@ -357,28 +351,28 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
} }
} }
//Check all insert before and append modifications for the current node. If necessary put it onto the stack. // Check all insert before and append modifications for the current node.
// If necessary put it onto the stack.
for (IASTNode currentModifiedNode : stack.getModifiedNodes()) { for (IASTNode currentModifiedNode : stack.getModifiedNodes()) {
for (ASTModification currentMod : stack.getModificationsForNode(currentModifiedNode)) { for (ASTModification currentMod : stack.getModificationsForNode(currentModifiedNode)) {
if(currentMod.getNewNode() == node){ if (currentMod.getNewNode() == node) {
if(currentMod.getKind() != ModificationKind.REPLACE) { if (currentMod.getKind() != ModificationKind.REPLACE) {
stack.pushScope(currentModifiedNode); stack.pushScope(currentModifiedNode);
return PROCESS_CONTINUE; return PROCESS_CONTINUE;
} }
} }
} }
} }
//Check all replace modifications for the current node. Visit the replacing node if found. // Check all replace modifications for the current node. Visit the replacing node if found.
for (IASTNode currentModifiedNode : stack.getModifiedNodes()) { for (IASTNode currentModifiedNode : stack.getModifiedNodes()) {
for (ASTModification currentMod : stack.getModificationsForNode(currentModifiedNode)) { for (ASTModification currentMod : stack.getModificationsForNode(currentModifiedNode)) {
if(currentMod.getTargetNode() == node && currentMod.getKind() == ModificationKind.REPLACE){ if (currentMod.getTargetNode() == node && currentMod.getKind() == ModificationKind.REPLACE) {
if(currentMod.getNewNode() != null){ if (currentMod.getNewNode() != null) {
stack.pushScope(node); stack.pushScope(node);
currentMod.getNewNode().accept(this); currentMod.getNewNode().accept(this);
stack.popScope(node); stack.popScope(node);
return PROCESS_SKIP; return PROCESS_SKIP;
} } else {
else{
return PROCESS_SKIP; return PROCESS_SKIP;
} }
} }
@ -389,7 +383,6 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
} }
private String getCorrespondingFile(IASTNode node) { private String getCorrespondingFile(IASTNode node) {
if (node.getFileLocation() != null) { if (node.getFileLocation() != null) {
return node.getFileLocation().getFileName(); return node.getFileLocation().getFileName();
} }
@ -398,11 +391,8 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor {
return getCorrespondingFile(node.getParent()); return getCorrespondingFile(node.getParent());
} }
for (IASTNode modifiedNode : modificationStore.getRootModifications() for (IASTNode modifiedNode : modificationStore.getRootModifications().getModifiedNodes()) {
.getModifiedNodes()) { for (ASTModification modification : modificationStore.getRootModifications().getModificationsForNode(modifiedNode)) {
for (ASTModification modification : modificationStore
.getRootModifications().getModificationsForNode(
modifiedNode)) {
if (modification.getNewNode() == node) { if (modification.getNewNode() == node) {
return getCorrespondingFile(modification.getTargetNode()); return getCorrespondingFile(modification.getTargetNode());
} }

View file

@ -74,6 +74,16 @@ public class StandaloneIndexerInputAdapter extends IndexerInputAdapter {
return false; return false;
} }
@Override
public boolean isIndexedUnconditionally(Object tu) {
return false;
}
@Override
public boolean isIndexedUnconditionally(IIndexFileLocation ifl) {
return false;
}
@Override @Override
public boolean isSource(String filename) { public boolean isSource(String filename) {
return isValidSourceUnitName(filename); return isValidSourceUnitName(filename);

View file

@ -83,10 +83,12 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
fUri= uri; fUri= uri;
fLinkageID= linkageID; fLinkageID= linkageID;
} }
@Override @Override
public int hashCode() { public int hashCode() {
return fUri.hashCode() * 31 + fLinkageID; return fUri.hashCode() * 31 + fLinkageID;
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
FileKey other = (FileKey) obj; FileKey other = (FileKey) obj;
@ -202,7 +204,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
fIsFastIndexer= fastIndexer; fIsFastIndexer= fastIndexer;
fFilesToUpdate= filesToUpdate; fFilesToUpdate= filesToUpdate;
Collections.addAll(fFilesToRemove, filesToRemove); Collections.addAll(fFilesToRemove, filesToRemove);
updateRequestedFiles(fFilesToUpdate.length + fFilesToRemove.size()); incrementRequestedFilesCount(fFilesToUpdate.length + fFilesToRemove.size());
fUrgentTasks = new LinkedList<AbstractIndexerTask>(); fUrgentTasks = new LinkedList<AbstractIndexerTask>();
} }
@ -402,7 +404,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
fFilesToUpdate = urgentTask.fFilesToUpdate; fFilesToUpdate = urgentTask.fFilesToUpdate;
fForceNumberFiles = urgentTask.fForceNumberFiles; fForceNumberFiles = urgentTask.fForceNumberFiles;
fFilesToRemove = urgentTask.fFilesToRemove; fFilesToRemove = urgentTask.fFilesToRemove;
updateRequestedFiles(fFilesToUpdate.length + fFilesToRemove.size()); incrementRequestedFilesCount(fFilesToUpdate.length + fFilesToRemove.size());
extractFiles(files, indexFilesToRemove, monitor); extractFiles(files, indexFilesToRemove, monitor);
removeFilesInIndex(fFilesToRemove, indexFilesToRemove, monitor); removeFilesInIndex(fFilesToRemove, indexFilesToRemove, monitor);
} }
@ -465,7 +467,6 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
final boolean checkTimestamps= (fUpdateFlags & IIndexManager.UPDATE_CHECK_TIMESTAMPS) != 0; final boolean checkTimestamps= (fUpdateFlags & IIndexManager.UPDATE_CHECK_TIMESTAMPS) != 0;
final boolean checkFileContentsHash = (fUpdateFlags & IIndexManager.UPDATE_CHECK_CONTENTS_HASH) != 0; final boolean checkFileContentsHash = (fUpdateFlags & IIndexManager.UPDATE_CHECK_CONTENTS_HASH) != 0;
final boolean checkConfig= (fUpdateFlags & IIndexManager.UPDATE_CHECK_CONFIGURATION) != 0; final boolean checkConfig= (fUpdateFlags & IIndexManager.UPDATE_CHECK_CONFIGURATION) != 0;
final boolean forceInclusion= (fUpdateFlags & IIndexManager.FORCE_INDEX_INCLUSION) != 0;
int count= 0; int count= 0;
int forceFirst= fForceNumberFiles; int forceFirst= fForceNumberFiles;
@ -484,7 +485,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
final boolean isExcludedSource= isSourceUnit && !fIndexFilesWithoutConfiguration && !fResolver.isFileBuildConfigured(tu); final boolean isExcludedSource= isSourceUnit && !fIndexFilesWithoutConfiguration && !fResolver.isFileBuildConfigured(tu);
if ((isSourceUnit && !isExcludedSource) || fIndexHeadersWithoutContext != UnusedHeaderStrategy.skip || if ((isSourceUnit && !isExcludedSource) || fIndexHeadersWithoutContext != UnusedHeaderStrategy.skip ||
forceInclusion) { fResolver.isIndexedUnconditionally(tu)) {
// Headers or sources required with a specific linkage // Headers or sources required with a specific linkage
AbstractLanguage[] langs= fResolver.getLanguages(tu, fIndexHeadersWithoutContext == UnusedHeaderStrategy.useBoth); AbstractLanguage[] langs= fResolver.getLanguages(tu, fIndexHeadersWithoutContext == UnusedHeaderStrategy.useBoth);
for (AbstractLanguage lang : langs) { for (AbstractLanguage lang : langs) {
@ -515,7 +516,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
for (IIndexFragmentFile ifile : indexFiles) { for (IIndexFragmentFile ifile : indexFiles) {
if (ifile != null) { if (ifile != null) {
IIndexInclude ctx= ifile.getParsedInContext(); IIndexInclude ctx= ifile.getParsedInContext();
if (ctx == null) { if (ctx == null && !fResolver.isIndexedUnconditionally(ifile.getLocation())) {
iFilesToRemove.add(ifile); iFilesToRemove.add(ifile);
count++; count++;
} else { } else {
@ -535,7 +536,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
} }
} }
synchronized (this) { synchronized (this) {
updateRequestedFiles(count - fFilesToUpdate.length); incrementRequestedFilesCount(count - fFilesToUpdate.length);
fFilesToUpdate= null; fFilesToUpdate= null;
} }
} }
@ -644,14 +645,14 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
for (IIndexFragmentFile ifile : ifiles) { for (IIndexFragmentFile ifile : ifiles) {
fIndex.clearFile(ifile, null); fIndex.clearFile(ifile, null);
} }
updateRequestedFiles(-1); incrementRequestedFilesCount(-1);
} }
for (IIndexFragmentFile ifile : indexFilesToRemove) { for (IIndexFragmentFile ifile : indexFilesToRemove) {
if (monitor.isCanceled()) { if (monitor.isCanceled()) {
return; return;
} }
fIndex.clearFile(ifile, null); fIndex.clearFile(ifile, null);
updateRequestedFiles(-1); incrementRequestedFilesCount(-1);
} }
} finally { } finally {
fIndex.releaseWriteLock(1); fIndex.releaseWriteLock(1);

View file

@ -0,0 +1,85 @@
/*******************************************************************************
* Copyright (c) 2011 Google, Inc 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
*
* Contributors:
* Sergey Prigogin (Google) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom;
import java.util.HashMap;
/**
* Thread-safe reference counted set of objects.
*
* @param <T> Type of the objects contained in the set.
*/
public class AtomicMultiSet<T> {
private final HashMap<T, Integer> map = new HashMap<T, Integer>();
/**
* Adds object to the set if it was not present, or increments its reference count
* otherwise.
* @param object The object to add to the set.
* @return Reference count of the object after the operation.
*/
public synchronized int add(T object) {
Integer count = map.get(object);
if (count == null) {
count = Integer.valueOf(1);
} else {
count = Integer.valueOf(count.intValue() + 1);
}
map.put(object, count);
return count.intValue();
}
/**
* Decrements reference count of the object in the set and removes the object if its
* reference count reaches zero.
* @param object The object to remove from the set.
* @return Reference count of the object after the operation, or -1 if the object was not
* present in the set.
*/
public synchronized int remove(T object) {
Integer count = map.remove(object);
if (count == null) {
return -1;
}
int n = count.intValue() - 1;
if (n <= 0) {
return n;
}
map.put(object, Integer.valueOf(n));
return n;
}
public synchronized void clear() {
map.clear();
}
public synchronized boolean contains(T object) {
return map.containsKey(object);
}
public synchronized int getCount(T object) {
Integer count = map.get(object);
return count != null ? count.intValue() : 0;
}
public synchronized boolean isEmpty() {
return map.isEmpty();
}
public synchronized int size() {
return map.size();
}
@Override
public synchronized String toString() {
return map.toString();
}
}

View file

@ -50,11 +50,25 @@ public abstract class IndexerInputAdapter extends ASTFilePathResolver {
public abstract boolean isFileBuildConfigured(Object tu); public abstract boolean isFileBuildConfigured(Object tu);
/** /**
* Returns whether the given translation-unit is not indexed unless it gets included. * Returns whether the given translation unit is not indexed unless it gets included.
* This applies to files that are outside of a source root. * This applies to files that are outside of a source root.
*/ */
public abstract boolean isIndexedOnlyIfIncluded(Object tu); public abstract boolean isIndexedOnlyIfIncluded(Object tu);
/**
* Checks whether the given translation unit should be indexed unconditionally.
* @param tu An ITranslationUnit or a file location in String form.
* @return {@code true} if the translation unit should be indexed unconditionally.
*/
public abstract boolean isIndexedUnconditionally(Object tu);
/**
* Checks whether the given file should be indexed unconditionally.
* @param ifl The Location of the file.
* @return {@code true} if the file should be indexed unconditionally.
*/
public abstract boolean isIndexedUnconditionally(IIndexFileLocation ifl);
/** /**
* Tests whether the file in the index is allowed to be part of an SDK. If not * Tests whether the file in the index is allowed to be part of an SDK. If not
* it will be indexed. * it will be indexed.

View file

@ -147,6 +147,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private final LinkedList<Runnable> fChangeEvents= new LinkedList<Runnable>(); private final LinkedList<Runnable> fChangeEvents= new LinkedList<Runnable>();
private final Job fNotificationJob; private final Job fNotificationJob;
private final AtomicMultiSet<IIndexFileLocation> fFilesIndexedUnconditionlly= new AtomicMultiSet<IIndexFileLocation>();
/** /**
* Stores mapping from pdom to project, used to serialize creation of new pdoms. * Stores mapping from pdom to project, used to serialize creation of new pdoms.
*/ */
@ -635,7 +637,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
IConfigurationElement element = elements[i]; IConfigurationElement element = elements[i];
if ("run".equals(element.getName())) { //$NON-NLS-1$ if ("run".equals(element.getName())) { //$NON-NLS-1$
try { try {
indexer = (IPDOMIndexer)element.createExecutableExtension("class"); //$NON-NLS-1$ indexer = (IPDOMIndexer) element.createExecutableExtension("class"); //$NON-NLS-1$
indexer.setProperties(props); indexer.setProperties(props);
} catch (CoreException e) { } catch (CoreException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
@ -1366,6 +1368,24 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private void update(ICProject project, List<ICElement> filesAndFolders, int options) throws CoreException { private void update(ICProject project, List<ICElement> filesAndFolders, int options) throws CoreException {
assert !Thread.holdsLock(fProjectToPDOM); assert !Thread.holdsLock(fProjectToPDOM);
synchronized (fUpdatePolicies) { synchronized (fUpdatePolicies) {
if ((options & IIndexManager.FORCE_INDEX_INCLUSION) != 0) {
for (ICElement element : filesAndFolders) {
if (element instanceof ITranslationUnit) {
ITranslationUnit tu = (ITranslationUnit) element;
IIndexFileLocation ifl = IndexLocationFactory.getIFL(tu);
fFilesIndexedUnconditionlly.add(ifl);
}
}
}
if ((options & IIndexManager.RESET_INDEX_INCLUSION) != 0) {
for (ICElement element : filesAndFolders) {
if (element instanceof ITranslationUnit) {
ITranslationUnit tu = (ITranslationUnit) element;
IIndexFileLocation ifl = IndexLocationFactory.getIFL(tu);
fFilesIndexedUnconditionlly.remove(ifl);
}
}
}
IPDOMIndexer indexer= getIndexer(project); IPDOMIndexer indexer= getIndexer(project);
PDOMUpdateTask task= new PDOMUpdateTask(indexer, options); PDOMUpdateTask task= new PDOMUpdateTask(indexer, options);
task.setTranslationUnitSelection(filesAndFolders); task.setTranslationUnitSelection(filesAndFolders);
@ -1541,4 +1561,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
return true; return true;
} }
public boolean isFileIndexedUnconditionally(IIndexFileLocation ifl) {
return fFilesIndexedUnconditionlly.contains(ifl);
}
} }

View file

@ -531,7 +531,7 @@ abstract public class PDOMWriter {
/** /**
* Updates current progress information with the provided delta. * Updates current progress information with the provided delta.
*/ */
protected final void updateRequestedFiles(int delta) { protected final void incrementRequestedFilesCount(int delta) {
synchronized (fInfo) { synchronized (fInfo) {
fInfo.fRequestedFilesCount += delta; fInfo.fRequestedFilesCount += delta;
} }

View file

@ -52,8 +52,8 @@ public class WritablePDOM extends PDOM implements IWritableIndexFragment {
this(dbPath, locationConverter, ChunkCache.getSharedInstance(), linkageFactoryMappings); this(dbPath, locationConverter, ChunkCache.getSharedInstance(), linkageFactoryMappings);
} }
public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter, ChunkCache cache, Map<String, public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter, ChunkCache cache,
IPDOMLinkageFactory> linkageFactoryMappings) throws CoreException { Map<String, IPDOMLinkageFactory> linkageFactoryMappings) throws CoreException {
super(dbPath, locationConverter, cache, linkageFactoryMappings); super(dbPath, locationConverter, cache, linkageFactoryMappings);
} }

View file

@ -28,6 +28,7 @@ import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.parser.FileContent; import org.eclipse.cdt.core.parser.FileContent;
import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.parser.InternalParserUtil; import org.eclipse.cdt.internal.core.parser.InternalParserUtil;
import org.eclipse.cdt.internal.core.pdom.IndexerInputAdapter; import org.eclipse.cdt.internal.core.pdom.IndexerInputAdapter;
import org.eclipse.cdt.internal.core.resources.PathCanonicalizationStrategy; import org.eclipse.cdt.internal.core.resources.PathCanonicalizationStrategy;
@ -241,6 +242,17 @@ public class ProjectIndexerInputAdapter extends IndexerInputAdapter {
return tu instanceof PotentialTranslationUnit; return tu instanceof PotentialTranslationUnit;
} }
@Override
public boolean isIndexedUnconditionally(Object tuo) {
ITranslationUnit tu= (ITranslationUnit) tuo;
return isIndexedUnconditionally(IndexLocationFactory.getIFL(tu));
}
@Override
public boolean isIndexedUnconditionally(IIndexFileLocation ifl) {
return CCoreInternals.getPDOMManager().isFileIndexedUnconditionally(ifl);
}
@Override @Override
public boolean isSourceUnit(Object tuo) { public boolean isSourceUnit(Object tuo) {
ITranslationUnit tu= (ITranslationUnit) tuo; ITranslationUnit tu= (ITranslationUnit) tuo;

View file

@ -27,7 +27,7 @@ import org.eclipse.cdt.internal.ui.editor.SemanticHighlightings;
*/ */
public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest { public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
private static final boolean PRINT_POSITIONS= true; private static final boolean PRINT_POSITIONS= false;
private static final Class<?> THIS= SemanticHighlightingTest.class; private static final Class<?> THIS= SemanticHighlightingTest.class;

View file

@ -39,6 +39,8 @@ import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentType; import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.help.IContext; import org.eclipse.help.IContext;
import org.eclipse.help.IContextProvider; import org.eclipse.help.IContextProvider;
@ -176,13 +178,8 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants; import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IIndexManager; import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ILanguage;
@ -208,20 +205,20 @@ 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.StructureSelectHistoryAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectEnclosingAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectNextAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectPreviousAction;
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;
import org.eclipse.cdt.internal.ui.actions.GotoNextBookmarkAction; import org.eclipse.cdt.internal.ui.actions.GotoNextBookmarkAction;
import org.eclipse.cdt.internal.ui.actions.IndentAction; import org.eclipse.cdt.internal.ui.actions.IndentAction;
import org.eclipse.cdt.internal.ui.actions.RemoveBlockCommentAction; import org.eclipse.cdt.internal.ui.actions.RemoveBlockCommentAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectEnclosingAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectHistoryAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectNextAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectPreviousAction;
import org.eclipse.cdt.internal.ui.actions.StructureSelectionAction; import org.eclipse.cdt.internal.ui.actions.StructureSelectionAction;
import org.eclipse.cdt.internal.ui.actions.SurroundWithActionGroup; import org.eclipse.cdt.internal.ui.actions.SurroundWithActionGroup;
import org.eclipse.cdt.internal.ui.search.IOccurrencesFinder.OccurrenceLocation;
import org.eclipse.cdt.internal.ui.search.IOccurrencesFinder; import org.eclipse.cdt.internal.ui.search.IOccurrencesFinder;
import org.eclipse.cdt.internal.ui.search.IOccurrencesFinder.OccurrenceLocation;
import org.eclipse.cdt.internal.ui.search.OccurrencesFinder; import org.eclipse.cdt.internal.ui.search.OccurrencesFinder;
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup; import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
import org.eclipse.cdt.internal.ui.text.CHeuristicScanner; import org.eclipse.cdt.internal.ui.text.CHeuristicScanner;
@ -272,7 +269,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
// look up the current range of the marker when the document has been edited // look up the current range of the marker when the document has been edited
IAnnotationModel model= getDocumentProvider().getAnnotationModel(getEditorInput()); IAnnotationModel model= getDocumentProvider().getAnnotationModel(getEditorInput());
if (model instanceof AbstractMarkerAnnotationModel) { if (model instanceof AbstractMarkerAnnotationModel) {
AbstractMarkerAnnotationModel markerModel= (AbstractMarkerAnnotationModel) model; AbstractMarkerAnnotationModel markerModel= (AbstractMarkerAnnotationModel) model;
Position pos= markerModel.getMarkerPosition(marker); Position pos= markerModel.getMarkerPosition(marker);
if (pos != null && !pos.isDeleted()) { if (pos != null && !pos.isDeleted()) {
@ -1226,6 +1222,70 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
} }
} }
private class IndexerPreferenceListener implements IPreferenceChangeListener {
private IProject fProject;
public void preferenceChange(PreferenceChangeEvent event) {
if (IndexerPreferences.KEY_INDEX_ON_OPEN.equals(event.getKey())) {
ICElement element= getInputCElement();
ITranslationUnit tu = element != null ? (ITranslationUnit) element : null;
updateIndexInclusion(tu, false);
}
}
void registerFor(IProject project) {
if (fProject == project || fProject != null && fProject.equals(project)) {
return;
}
unregister();
fProject = project;
if (fProject != null) {
IndexerPreferences.addChangeListener(fProject, this);
}
}
void unregister() {
if (fProject != null) {
IndexerPreferences.removeChangeListener(fProject, this);
fProject = null;
}
}
}
private static class IndexUpdateRequestorJob extends Job {
private final ITranslationUnit tuToAdd;
private final ITranslationUnit tuToReset;
/**
* @param tu The translation unit to add or to remove from the index.
* @param add {@code true} to add, {@code false} to reset index inclusion.
*/
IndexUpdateRequestorJob(ITranslationUnit tuToAdd, ITranslationUnit tuToReset) {
super(CEditorMessages.CEditor_index_expander_job_name);
this.tuToAdd = tuToAdd;
this.tuToReset = tuToReset;
setSystem(true);
setPriority(Job.DECORATE);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
IIndexManager indexManager = CCorePlugin.getIndexManager();
if (tuToReset != null) {
indexManager.update(new ICElement[] { tuToReset },
IIndexManager.RESET_INDEX_INCLUSION | IIndexManager.UPDATE_CHECK_TIMESTAMPS);
}
if (tuToAdd != null) {
indexManager.update(new ICElement[] { tuToAdd },
IIndexManager.FORCE_INDEX_INCLUSION | IIndexManager.UPDATE_CHECK_TIMESTAMPS);
}
} catch (CoreException e) {
}
return Status.OK_STATUS;
}
}
/** /**
* The editor selection changed listener. * The editor selection changed listener.
* *
@ -1335,6 +1395,11 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
private SelectionHistory fSelectionHistory; private SelectionHistory fSelectionHistory;
/** The translation unit that was added by the editor to index, or <code>null</code>. */
private ITranslationUnit fTuAddedToIndex;
private IndexerPreferenceListener fIndexerPreferenceListener;
private static final Set<String> angularIntroducers = new HashSet<String>(); private static final Set<String> angularIntroducers = new HashSet<String>();
static { static {
angularIntroducers.add("template"); //$NON-NLS-1$ angularIntroducers.add("template"); //$NON-NLS-1$
@ -1370,6 +1435,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
setOutlinerContextMenuId("#CEditorOutlinerContext"); //$NON-NLS-1$ setOutlinerContextMenuId("#CEditorOutlinerContext"); //$NON-NLS-1$
fCEditorErrorTickUpdater = new CEditorErrorTickUpdater(this); fCEditorErrorTickUpdater = new CEditorErrorTickUpdater(this);
fIndexerPreferenceListener = new IndexerPreferenceListener();
} }
/** /**
@ -1422,6 +1488,8 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
if (cSourceViewer != null && isFoldingEnabled() && (store == null || !store.getBoolean(PreferenceConstants.EDITOR_SHOW_SEGMENTS))) if (cSourceViewer != null && isFoldingEnabled() && (store == null || !store.getBoolean(PreferenceConstants.EDITOR_SHOW_SEGMENTS)))
cSourceViewer.prepareDelayedProjection(); cSourceViewer.prepareDelayedProjection();
fIndexerPreferenceListener.unregister();
super.doSetInput(input); super.doSetInput(input);
setOutlinePageInput(fOutlinePage, input); setOutlinePageInput(fOutlinePage, input);
@ -1433,57 +1501,39 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
fCEditorErrorTickUpdater.updateEditorImage(getInputCElement()); fCEditorErrorTickUpdater.updateEditorImage(getInputCElement());
} }
ICElement element= getInputCElement(); ICElement element= getInputCElement();
if (element != null) {
IProject project = element.getCProject().getProject();
fIndexerPreferenceListener.registerFor(project);
}
if (element instanceof ITranslationUnit) { if (element instanceof ITranslationUnit) {
ITranslationUnit tu = (ITranslationUnit) element; ITranslationUnit tu = (ITranslationUnit) element;
addToIndexIfNecessary(tu); updateIndexInclusion(tu, false);
fBracketMatcher.configure(tu.getLanguage()); fBracketMatcher.configure(tu.getLanguage());
} else { } else {
updateIndexInclusion(null, false);
fBracketMatcher.configure(null); fBracketMatcher.configure(null);
} }
} }
private void addToIndexIfNecessary(ITranslationUnit tu) { private void updateIndexInclusion(ITranslationUnit tu, boolean synchronous) {
IProject project = tu.getCProject().getProject(); if (tu!= null) {
if (String.valueOf(true).equals(IndexerPreferences.get(project, IndexerPreferences.KEY_INDEX_ON_OPEN, null))) { IProject project = tu.getCProject().getProject();
IndexUpdateRequestorJob job = new IndexUpdateRequestorJob(tu); if (!String.valueOf(true).equals(IndexerPreferences.get(project, IndexerPreferences.KEY_INDEX_ON_OPEN, null))) {
job.schedule(); tu = null;
} }
} }
if (tu != null || fTuAddedToIndex != null) {
private static class IndexUpdateRequestorJob extends Job { IndexUpdateRequestorJob job = new IndexUpdateRequestorJob(tu, fTuAddedToIndex);
private final ITranslationUnit tu; fTuAddedToIndex = tu;
job.schedule();
IndexUpdateRequestorJob(ITranslationUnit tu) { if (synchronous) {
super(CEditorMessages.CEditor_index_expander_job_name); try {
this.tu = tu; job.join();
setSystem(true); } catch (InterruptedException e) {
setPriority(Job.DECORATE); // Ignore.
} }
@Override
protected IStatus run(IProgressMonitor monitor) {
ICProject[] projects;
try {
projects = CoreModel.getDefault().getCModel().getCProjects();
IIndexManager indexManager = CCorePlugin.getIndexManager();
IIndex index = indexManager.getIndex(projects);
index.acquireReadLock();
try {
IIndexFileLocation ifl = IndexLocationFactory.getIFL(tu);
IIndexFile file = index.getFile(tu.getLanguage().getLinkageID(), ifl);
if (file != null) {
return Status.OK_STATUS; // Already indexed.
}
indexManager.update(new ICElement[] { tu },
IIndexManager.FORCE_INDEX_INCLUSION | IIndexManager.UPDATE_CHECK_TIMESTAMPS);
} finally {
index.releaseReadLock();
}
} catch (CModelException e) {
} catch (CoreException e) {
} catch (InterruptedException e) {
} }
return Status.OK_STATUS;
} }
} }
@ -2148,6 +2198,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
*/ */
@Override @Override
public void dispose() { public void dispose() {
updateIndexInclusion(null, true);
ISourceViewer sourceViewer = getSourceViewer(); ISourceViewer sourceViewer = getSourceViewer();
if (sourceViewer instanceof ITextViewerExtension) if (sourceViewer instanceof ITextViewerExtension)

View file

@ -7,7 +7,7 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring; package org.eclipse.cdt.internal.ui.refactoring;
@ -30,17 +30,13 @@ import org.eclipse.osgi.util.NLS;
* A Change for creating a new file with the given name, content and encoding at the specified path. * A Change for creating a new file with the given name, content and encoding at the specified path.
* *
* @author Emanuel Graf * @author Emanuel Graf
*
*/ */
public class CreateFileChange extends Change { public class CreateFileChange extends Change {
private String name; private String name;
private final IPath path; private final IPath path;
private final String source; private final String source;
private final String encoding; private final String encoding;
public CreateFileChange(String name, IPath path, String source, String encoding) { public CreateFileChange(String name, IPath path, String source, String encoding) {
super(); super();
this.name = name; this.name = name;
@ -55,13 +51,12 @@ public class CreateFileChange extends Change {
@Override @Override
public Object getModifiedElement() { public Object getModifiedElement() {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path); return ResourcesPlugin.getWorkspace().getRoot().getFile(path);
return file;
} }
@Override @Override
public String getName() { public String getName() {
if(name == null) { if (name == null) {
return NLS.bind(Messages.CreateFileChange_CreateFile, path.toOSString()); return NLS.bind(Messages.CreateFileChange_CreateFile, path.toOSString());
} }
return name; return name;
@ -72,8 +67,8 @@ public class CreateFileChange extends Change {
} }
@Override @Override
public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException, public RefactoringStatus isValid(IProgressMonitor pm)
OperationCanceledException { throws CoreException, OperationCanceledException {
RefactoringStatus result= new RefactoringStatus(); RefactoringStatus result= new RefactoringStatus();
IFile file= ResourcesPlugin.getWorkspace().getRoot().getFile(path); IFile file= ResourcesPlugin.getWorkspace().getRoot().getFile(path);
@ -84,8 +79,7 @@ public class CreateFileChange extends Change {
} }
if (file.exists()) { if (file.exists()) {
result.addFatalError( NLS.bind(Messages.CreateFileChange_FileExists, result.addFatalError(NLS.bind(Messages.CreateFileChange_FileExists, file.getFullPath().toString()));
file.getFullPath().toString()));
return result; return result;
} }
return result; return result;
@ -96,14 +90,12 @@ public class CreateFileChange extends Change {
IFile file= ResourcesPlugin.getWorkspace().getRoot().getFile(path); IFile file= ResourcesPlugin.getWorkspace().getRoot().getFile(path);
InputStream is = new ByteArrayInputStream(source.getBytes()); InputStream is = new ByteArrayInputStream(source.getBytes());
file.create(is, false, new SubProgressMonitor(pm, 1)); file.create(is, false, new SubProgressMonitor(pm, 1));
if(encoding != null) { if (encoding != null) {
file.setCharset(encoding, new SubProgressMonitor(pm,1)); file.setCharset(encoding, new SubProgressMonitor(pm,1));
} }
return new DeleteFileChange(file.getFullPath()); return new DeleteFileChange(file.getFullPath());
} }
public String getSource() { public String getSource() {
return source; return source;
} }
@ -116,5 +108,4 @@ public class CreateFileChange extends Change {
public String toString() { public String toString() {
return getName(); return getName();
} }
} }

View file

@ -7,7 +7,7 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring; package org.eclipse.cdt.internal.ui.refactoring;
@ -17,6 +17,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.rewrite.ASTRewrite; import org.eclipse.cdt.core.dom.rewrite.ASTRewrite;
@ -30,7 +31,7 @@ import org.eclipse.cdt.core.dom.rewrite.ASTRewrite;
public class ModificationCollector { public class ModificationCollector {
// Each translation unit can have only one ASTRewrite // Each translation unit can have only one ASTRewrite
private final Map<IASTTranslationUnit, ASTRewrite> rewriters = private final Map<IASTTranslationUnit, ASTRewrite> rewriters =
new HashMap<IASTTranslationUnit, ASTRewrite>(); new HashMap<IASTTranslationUnit, ASTRewrite>();
private Collection<CreateFileChange> changes; private Collection<CreateFileChange> changes;
@ -38,7 +39,6 @@ public class ModificationCollector {
if (!rewriters.containsKey(ast)) { if (!rewriters.containsKey(ast)) {
rewriters.put(ast, ASTRewrite.create(ast)); rewriters.put(ast, ASTRewrite.create(ast));
} }
return rewriters.get(ast); return rewriters.get(ast);
} }
@ -55,13 +55,31 @@ public class ModificationCollector {
CCompositeChange result = new CCompositeChange(""); //$NON-NLS-1$ CCompositeChange result = new CCompositeChange(""); //$NON-NLS-1$
result.markAsSynthetic(); result.markAsSynthetic();
if (changes != null) if (changes != null) {
result.addAll(changes.toArray(new Change[changes.size()])); for (Change change : changes) {
addFlattened(change, result);
}
}
for (ASTRewrite each : rewriters.values()) { for (ASTRewrite each : rewriters.values()) {
result.add(each.rewriteAST()); Change change = each.rewriteAST();
addFlattened(change, result);
} }
return result; return result;
} }
/**
* If {@code change} is a CompositeChange, merges it into the {@code receiver}, otherwise
* adds it to the {@code receiver}.
* @param change The change being added.
* @param receiver The composite change that receives the addition.
*/
private void addFlattened(Change change, CompositeChange receiver) {
if (change instanceof CompositeChange) {
receiver.merge((CompositeChange) change);
} else {
receiver.add(change);
}
}
} }

View file

@ -12,6 +12,8 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters; package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import java.util.Arrays;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
@ -118,21 +120,26 @@ public class FunctionFactory {
CPPASTCompoundStatement compound = new CPPASTCompoundStatement(); CPPASTCompoundStatement compound = new CPPASTCompoundStatement();
CPPASTExpressionStatement exprStmt = new CPPASTExpressionStatement(); CPPASTExpressionStatement exprStmt = new CPPASTExpressionStatement();
CPPASTBinaryExpression binExpr = new CPPASTBinaryExpression(); CPPASTBinaryExpression binExpr = new CPPASTBinaryExpression();
CPPASTFieldReference fieldRef = new CPPASTFieldReference();
CPPASTLiteralExpression litExpr = new CPPASTLiteralExpression();
litExpr.setValue(Keywords.cTHIS);
fieldRef.setFieldOwner(litExpr);
IASTDeclarator innerDeclarator = fieldDeclaration.getDeclarators()[0]; IASTDeclarator innerDeclarator = fieldDeclaration.getDeclarators()[0];
while (innerDeclarator.getNestedDeclarator() != null) { while (innerDeclarator.getNestedDeclarator() != null) {
innerDeclarator = innerDeclarator.getNestedDeclarator(); innerDeclarator = innerDeclarator.getNestedDeclarator();
} }
IASTName fieldName = innerDeclarator.getName(); IASTName fieldName = innerDeclarator.getName();
fieldRef.setFieldName(fieldName.copy(CopyStyle.withLocations)); CPPASTName parameterName = getSetterParameterName(fieldName);
fieldRef.setIsPointerDereference(true); if (Arrays.equals(fieldName.getSimpleID(), parameterName.getSimpleID())) {
binExpr.setOperand1(fieldRef); CPPASTFieldReference fieldRef = new CPPASTFieldReference();
CPPASTLiteralExpression litExpr = new CPPASTLiteralExpression();
litExpr.setValue(Keywords.cTHIS);
fieldRef.setFieldOwner(litExpr);
fieldRef.setIsPointerDereference(true);
fieldRef.setFieldName(fieldName.copy(CopyStyle.withLocations));
binExpr.setOperand1(fieldRef);
} else {
CPPASTIdExpression idExpr = new CPPASTIdExpression(fieldName.copy(CopyStyle.withLocations));
binExpr.setOperand1(idExpr);
}
binExpr.setOperator(IASTBinaryExpression.op_assign); binExpr.setOperator(IASTBinaryExpression.op_assign);
CPPASTIdExpression idExpr = new CPPASTIdExpression(); CPPASTIdExpression idExpr = new CPPASTIdExpression(parameterName);
idExpr.setName(fieldName.copy(CopyStyle.withLocations));
binExpr.setOperand2(idExpr); binExpr.setOperand2(idExpr);
exprStmt.setExpression(binExpr); exprStmt.setExpression(binExpr);
compound.addStatement(exprStmt); compound.addStatement(exprStmt);
@ -151,13 +158,20 @@ public class FunctionFactory {
declarator.setName(setterName); declarator.setName(setterName);
} }
CPPASTParameterDeclaration parameterDeclaration = new CPPASTParameterDeclaration(); CPPASTParameterDeclaration parameterDeclaration = new CPPASTParameterDeclaration();
parameterDeclaration.setDeclarator(fieldDeclaration.getDeclarators()[0].copy(CopyStyle.withLocations)); IASTDeclarator parameterDeclarator = fieldDeclaration.getDeclarators()[0].copy(CopyStyle.withLocations);
parameterDeclarator.setName(getSetterParameterName(fieldName));
parameterDeclaration.setDeclarator(parameterDeclarator);
parameterDeclaration.setDeclSpecifier(fieldDeclaration.getDeclSpecifier().copy( parameterDeclaration.setDeclSpecifier(fieldDeclaration.getDeclSpecifier().copy(
CopyStyle.withLocations)); CopyStyle.withLocations));
declarator.addParameterDeclaration(parameterDeclaration.copy(CopyStyle.withLocations)); declarator.addParameterDeclaration(parameterDeclaration.copy(CopyStyle.withLocations));
return declarator; return declarator;
} }
private static CPPASTName getSetterParameterName(IASTName fieldName) {
String parameterName = GetterSetterNameGenerator.generateSetterParameterName(fieldName);
return new CPPASTName(parameterName.toCharArray());
}
private static CPPASTSimpleDeclSpecifier getVoidDeclSpec() { private static CPPASTSimpleDeclSpecifier getVoidDeclSpec() {
CPPASTSimpleDeclSpecifier declSpecifier = new CPPASTSimpleDeclSpecifier(); CPPASTSimpleDeclSpecifier declSpecifier = new CPPASTSimpleDeclSpecifier();
declSpecifier.setType(IASTSimpleDeclSpecifier.t_void); declSpecifier.setType(IASTSimpleDeclSpecifier.t_void);

View file

@ -79,6 +79,22 @@ public class GetterSetterNameGenerator {
return composer.compose(name); return composer.compose(name);
} }
public static String generateSetterParameterName(IASTName fieldName) {
IPreferencesService preferences = Platform.getPreferencesService();
int capitalization = preferences.getInt(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_VARIABLE_CAPITALIZATION,
PreferenceConstants.NAME_STYLE_CAPITALIZATION_ORIGINAL, null);
String wordDelimiter = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_VARIABLE_WORD_DELIMITER, "", null); //$NON-NLS-1$
String prefix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_VARIABLE_PREFIX, "", null); //$NON-NLS-1$
String suffix = preferences.getString(CUIPlugin.PLUGIN_ID,
PreferenceConstants.NAME_STYLE_VARIABLE_SUFFIX, "", null); //$NON-NLS-1$
NameComposer composer = new NameComposer(capitalization, wordDelimiter, prefix, suffix);
String name = GetterSetterNameGenerator.trimFieldName(fieldName.toString());
return composer.compose(name);
}
/** /**
* Returns the trimmed field name. Leading and trailing non-alphanumeric characters are trimmed. * Returns the trimmed field name. Leading and trailing non-alphanumeric characters are trimmed.
* If the first word of the name consists of a single letter and the name contains more than * If the first word of the name consists of a single letter and the name contains more than

View file

@ -37,6 +37,11 @@ public class ImplementMethodData implements ITreeContentProvider{
for (IASTSimpleDeclaration declaration : methodDeclarations) { for (IASTSimpleDeclaration declaration : methodDeclarations) {
this.methodDeclarations.add(new MethodToImplementConfig(declaration, new ParameterHandler(declaration))); this.methodDeclarations.add(new MethodToImplementConfig(declaration, new ParameterHandler(declaration)));
} }
// Only one declaration available, might as well check it
if (this.methodDeclarations.size() == 1) {
this.methodDeclarations.get(0).setChecked(true);
}
} }
public List<MethodToImplementConfig> getMethodDeclarations() { public List<MethodToImplementConfig> getMethodDeclarations() {

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2010 QNX Software Systems and others. * Copyright (c) 2004, 2011 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -12,9 +12,6 @@
package org.eclipse.cdt.debug.internal.ui; package org.eclipse.cdt.debug.internal.ui;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
public interface IInternalCDebugUIConstants { public interface IInternalCDebugUIConstants {
@ -36,14 +33,6 @@ public interface IInternalCDebugUIConstants {
*/ */
public static final String DISASSEMBLY_FONT = PREFIX + "disassemblyFont"; //$NON-NLS-1$ public static final String DISASSEMBLY_FONT = PREFIX + "disassemblyFont"; //$NON-NLS-1$
/**
* The color id to highlight the source lines in disassembly view. This color is managed via
* the workbench font preference page.
*/
public static final String DISASSEMBLY_SOURCE_LINE_COLOR = PREFIX + "disassembly.sourceLineColor"; //$NON-NLS-1$
public static final RGB DEFAULT_DISASSEMBLY_SOURCE_LINE_RGB = Display.getDefault().getSystemColor( SWT.COLOR_DARK_BLUE ).getRGB();
// Current stack frame instruction pointer // Current stack frame instruction pointer
public static final String DISASM_INSTRUCTION_POINTER = PREFIX + "disassemblyInstructionPointer"; //$NON-NLS-1$ public static final String DISASM_INSTRUCTION_POINTER = PREFIX + "disassemblyInstructionPointer"; //$NON-NLS-1$

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2010 QNX Software Systems and others. * Copyright (c) 2004, 2011 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -22,13 +22,11 @@ import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.ICDebugConstants; import org.eclipse.cdt.debug.core.ICDebugConstants;
import org.eclipse.cdt.debug.core.cdi.ICDIFormat; import org.eclipse.cdt.debug.core.cdi.ICDIFormat;
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds; import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.utils.ui.controls.ControlFactory; import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.IDebugView; import org.eclipse.debug.ui.IDebugView;
import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.util.PropertyChangeEvent;
@ -106,6 +104,7 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
* *
* @see org.eclipse.jface.preference.PreferencePage#createContents(Composite) * @see org.eclipse.jface.preference.PreferencePage#createContents(Composite)
*/ */
@Override
protected Control createContents( Composite parent ) { protected Control createContents( Composite parent ) {
getWorkbench().getHelpSystem().setHelp( getControl(), ICDebugHelpContextIds.C_DEBUG_PREFERENCE_PAGE ); getWorkbench().getHelpSystem().setHelp( getControl(), ICDebugHelpContextIds.C_DEBUG_PREFERENCE_PAGE );
//The main composite //The main composite
@ -174,12 +173,12 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
*/ */
public static void initDefaults( IPreferenceStore store ) { public static void initDefaults( IPreferenceStore store ) {
store.setDefault( ICDebugPreferenceConstants.PREF_SHOW_HEX_VALUES, false ); store.setDefault( ICDebugPreferenceConstants.PREF_SHOW_HEX_VALUES, false );
PreferenceConverter.setDefault( store, IInternalCDebugUIConstants.DISASSEMBLY_SOURCE_LINE_COLOR, IInternalCDebugUIConstants.DEFAULT_DISASSEMBLY_SOURCE_LINE_RGB );
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#dispose() * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
*/ */
@Override
public void dispose() { public void dispose() {
super.dispose(); super.dispose();
getPreferenceStore().removePropertyChangeListener( getPropertyChangeListener() ); getPreferenceStore().removePropertyChangeListener( getPropertyChangeListener() );
@ -246,6 +245,7 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePage#performOk() * @see org.eclipse.jface.preference.IPreferencePage#performOk()
*/ */
@Override
public boolean performOk() { public boolean performOk() {
storeValues(); storeValues();
if ( getPropertyChangeListener().hasStateChanged() ) { if ( getPropertyChangeListener().hasStateChanged() ) {
@ -310,6 +310,7 @@ public class CDebugPreferencePage extends PreferencePage implements IWorkbenchPr
* *
* @see PreferencePage#performDefaults() * @see PreferencePage#performDefaults()
*/ */
@Override
protected void performDefaults() { protected void performDefaults() {
setDefaultValues(); setDefaultValues();
super.performDefaults(); super.performDefaults();

View file

@ -12,6 +12,8 @@ package org.eclipse.cdt.dsf.debug.ui.viewmodel.update;
import org.eclipse.cdt.dsf.debug.service.IRunControl.ISuspendedDMEvent; import org.eclipse.cdt.dsf.debug.service.IRunControl.ISuspendedDMEvent;
import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason; import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason;
import org.eclipse.cdt.dsf.debug.ui.viewmodel.numberformat.FormattedValueRetriever;
import org.eclipse.cdt.dsf.debug.ui.viewmodel.numberformat.FormattedValueVMUtil;
import org.eclipse.cdt.dsf.ui.viewmodel.update.IElementUpdateTester; import org.eclipse.cdt.dsf.ui.viewmodel.update.IElementUpdateTester;
/** /**
@ -21,6 +23,28 @@ public class BreakpointHitUpdatePolicy extends DebugManualUpdatePolicy {
public static String BREAKPOINT_HIT_UPDATE_POLICY_ID = "org.eclipse.cdt.dsf.debug.ui.viewmodel.update.breakpointHitUpdatePolicy"; //$NON-NLS-1$ public static String BREAKPOINT_HIT_UPDATE_POLICY_ID = "org.eclipse.cdt.dsf.debug.ui.viewmodel.update.breakpointHitUpdatePolicy"; //$NON-NLS-1$
/**
* Creates a breakpoint hit update policy for debug views.
*/
public BreakpointHitUpdatePolicy() {
super();
}
/**
* Creates a breakpoint hit update policy for debug views for models that
* retrieve multiple formatted values for each view entry. The given
* prefixes distinguish the formatted values properties from each other.
*
* @see FormattedValueRetriever
* @see FormattedValueVMUtil#getPropertyForFormatId(String, String)
*
* @param prefixes Prefixes to use when flushing the active formatted value
* from VM cache.
*/
public BreakpointHitUpdatePolicy(String[] prefixes) {
super(prefixes);
}
@Override @Override
public String getID() { public String getID() {
return BREAKPOINT_HIT_UPDATE_POLICY_ID; return BREAKPOINT_HIT_UPDATE_POLICY_ID;

View file

@ -731,7 +731,7 @@ public class VariableVMNode extends AbstractExpressionVMNode
int count = 0; int count = 0;
for (final IPropertiesUpdate update : updates) { for (final IPropertiesUpdate update : updates) {
IExpression expression = (IExpression)DebugPlugin.getAdapter(update.getElement(), IExpression.class); final IExpression expression = (IExpression)DebugPlugin.getAdapter(update.getElement(), IExpression.class);
if (expression != null) { if (expression != null) {
update.setProperty(AbstractExpressionVMNode.PROP_ELEMENT_EXPRESSION, expression.getExpressionText()); update.setProperty(AbstractExpressionVMNode.PROP_ELEMENT_EXPRESSION, expression.getExpressionText());
} }
@ -761,10 +761,13 @@ public class VariableVMNode extends AbstractExpressionVMNode
if (isSuccess()) { if (isSuccess()) {
fillExpressionDataProperties(update, getData()); fillExpressionDataProperties(update, getData());
} else { } else {
// In case of an error fill in the expression next in the name column. // In case of an error fill in the expression text in the name column and expressions columns.
IExpressionDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IExpressions.IExpressionDMContext.class); IExpressionDMContext dmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IExpressions.IExpressionDMContext.class);
if (dmc != null && dmc.getExpression() != null) { if (dmc != null && dmc.getExpression() != null) {
update.setProperty(PROP_NAME, dmc.getExpression()); update.setProperty(PROP_NAME, dmc.getExpression());
if (expression == null) {
update.setProperty(PROP_ELEMENT_EXPRESSION, dmc.getExpression());
}
} }
update.setStatus(getStatus()); update.setStatus(getStatus());
} }

View file

@ -10,6 +10,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.dsf.ui.viewmodel.properties; package org.eclipse.cdt.dsf.ui.viewmodel.properties;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
@ -113,8 +114,11 @@ public class PropertiesUpdateStatus extends DsfMultiStatus {
PropertiesUpdateStatus newStatus, Set<String> properties) PropertiesUpdateStatus newStatus, Set<String> properties)
{ {
PropertiesUpdateStatus mergedStatus = new PropertiesUpdateStatus(); PropertiesUpdateStatus mergedStatus = new PropertiesUpdateStatus();
// Copy the property status map from the base status.
mergedStatus.fPropertiesStatus.putAll(baseStatus.fPropertiesStatus); mergedStatus.fPropertiesStatus.putAll(baseStatus.fPropertiesStatus);
// Add in the property statuses from the new status, but only for the
// specified properties.
for (String property : properties) { for (String property : properties) {
IStatus propertyStatus = newStatus.getStatus(property); IStatus propertyStatus = newStatus.getStatus(property);
if (propertyStatus != null) { if (propertyStatus != null) {
@ -123,13 +127,30 @@ public class PropertiesUpdateStatus extends DsfMultiStatus {
mergedStatus.fPropertiesStatus.remove(property); mergedStatus.fPropertiesStatus.remove(property);
} }
} }
Set<IStatus> children = new HashSet<IStatus>((baseStatus.getChildren().length + newStatus.getChildren().length) * 4/3);
// Children of merged status should contain all statuses that are found in the fPropertiesStatus map, but
// without duplicates.
Set<IStatus> children = new HashSet<IStatus>((baseStatus.getChildren().length + newStatus.getChildren().length) * 4/3);
children.addAll(mergedStatus.fPropertiesStatus.values()); children.addAll(mergedStatus.fPropertiesStatus.values());
for (IStatus child : children) { for (IStatus child : children) {
mergedStatus.add(child); mergedStatus.add(child);
} }
// Merged status should contain all children statuses that were added without a corresponding property to the
// base status and to the new status.
Collection<IStatus> baseStatusPropertyChildren = baseStatus.fPropertiesStatus.values();
for (IStatus baseStatusChild : baseStatus.getChildren()) {
if (!baseStatusPropertyChildren.contains(baseStatusChild)) {
mergedStatus.add(baseStatusChild);
}
}
Collection<IStatus> newStatusPropertyChildren = newStatus.fPropertiesStatus.values();
for (IStatus newStatusChild : newStatus.getChildren()) {
if (!newStatusPropertyChildren.contains(newStatusChild)) {
mergedStatus.add(newStatusChild);
}
}
return mergedStatus; return mergedStatus;
} }

View file

@ -166,7 +166,7 @@ Option.noroconst=Do not place constant values in read only storage (-qnoroconst)
Option.roptr=Place constant pointers in read only storage (-qroptr) Option.roptr=Place constant pointers in read only storage (-qroptr)
Option.Statsym=Generate symbols for static variables (-qstatsym ) Option.Statsym=Generate symbols for static variables (-qstatsym )
Option.xcall=Generate code to treat static functions as external functions (-qxcall ) Option.xcall=Generate code to treat static functions as external functions (-qxcall )
Option.funcset=Place instructions for each function in a separate object file control section or csect (-qfuncset) Option.funcsect=Place instructions for each function in a separate object file control section or csect (-qfuncsect)
Option.ppline=Enable generation of #line directive in the preprocessed output (-qppline) Option.ppline=Enable generation of #line directive in the preprocessed output (-qppline)
Option.upconv=Preserve the unsigned specification when performing integral promotions (-qupconv) Option.upconv=Preserve the unsigned specification when performing integral promotions (-qupconv)
Option.namemangling=Name mangling scheme for external symbol names (-qnamemangling=) Option.namemangling=Name mangling scheme for external symbol names (-qnamemangling=)
@ -193,6 +193,7 @@ Option.statsym = Add static variables to the symbol table (-qstatsym)
Option.threaded = Enable multi-threaded execution (-qthreaded) Option.threaded = Enable multi-threaded execution (-qthreaded)
Option.unique = Generate unique names for static constructor/deconstructor file compilation units (-qunique) Option.unique = Generate unique names for static constructor/deconstructor file compilation units (-qunique)
Option.unique.v10 = Generate unique names for static constructor/deconstructor file compilation units (-qunique) Option.unique.v10 = Generate unique names for static constructor/deconstructor file compilation units (-qunique)
Option.qconcurrentupdate.v11 = Update the operating system while the kernel is running (-qconcurrentupdate)
Option.novftable = Do not generate virtual function table (-qnovftable) Option.novftable = Do not generate virtual function table (-qnovftable)
Option.vrsave = Maintain the VRSAVE register (-qvrsave) Option.vrsave = Maintain the VRSAVE register (-qvrsave)
Option.weaksymbol = Generate weak symbols (-qweaksymbol) Option.weaksymbol = Generate weak symbols (-qweaksymbol)
@ -202,7 +203,7 @@ Option.macros.pre=predefined (-qshowmacros=pre)
Option.macros.nopre=no macros (-qshowmacros=nopre) Option.macros.nopre=no macros (-qshowmacros=nopre)
Option.qstackprotect = Protect against malicious code or programming errors that overwrite or corrupt the stack (-qstackprotect=) Option.qstackprotect = Protect against malicious code or programming errors that overwrite or corrupt the stack (-qstackprotect=)
Options.timestamps=Suppress insert of implicit timestamps into an object file (-qnotimestamps) Options.timestamps=Suppress insert of implicit timestamps into an object file (-qnotimestamps)
Option.qrestrict = Stop pointers from accessing the same memory that has been addressed by function parameter pointers (-qrestrict=)
# Optimization options # Optimization options
Option.OptLevel = Optimization level Option.OptLevel = Optimization level

View file

@ -229,6 +229,25 @@
name="%Option.unique.v10" name="%Option.unique.v10"
resourceFilter="all" resourceFilter="all"
valueType="boolean"> valueType="boolean">
</option>
<option
applicabilityCalculator="org.eclipse.cdt.managedbuilder.xlc.ui.properties.XLCApplicabilityCalculator"
category="xlc.c.compiler.category.objcc"
command="-qconcurrentupdate"
defaultValue="false"
id="org.eclipse.cdt.managedbuilder.xlc.ui.cpp.option.output.qconcurrentupdate"
isAbstract="false"
name="%Option.qconcurrentupdate.v11"
resourceFilter="all"
valueType="boolean">
</option>
<option
applicabilityCalculator="org.eclipse.cdt.managedbuilder.xlc.ui.properties.XLCApplicabilityCalculator"
category="xlc.c.compiler.category.optimization"
command="-qrestrict"
id="xlc.c.compiler.option.optimization.qrestrict"
name="%Option.qrestrict"
valueType="string">
</option> </option>
</tool> </tool>
<tool <tool
@ -1495,10 +1514,10 @@
<option <option
category="xlc.c.compiler.category.output" category="xlc.c.compiler.category.output"
command="-qfuncset" command="-qfuncsect"
defaultValue="false" defaultValue="false"
id="xlc.c.compiler.option.output.funcset" id="xlc.c.compiler.option.output.funcsect"
name="%Option.funcset" name="%Option.funcsect"
valueType="boolean"> valueType="boolean">
</option> </option>
<option <option
@ -3393,34 +3412,12 @@
</enumeratedOptionValue> </enumeratedOptionValue>
</option> </option>
<option <option
applicabilityCalculator="org.eclipse.cdt.managedbuilder.xlc.ui.properties.XLCApplicabilityCalculator"
category="xlc.c.compiler.category.lm" category="xlc.c.compiler.category.lm"
command="-qlistfmt" command="-qlistfmt"
id="xlc.c.compiler.option.lm.qlistfmt" id="xlc.c.compiler.option.lm.qlistfmt"
name="%Option.qlistfmt" name="%Option.qlistfmt"
valueType="string"> valueType="string">
<enumeratedOptionValue
id="xlc.c.lm.attr.none"
isDefault="false"
name="%Option.none">
</enumeratedOptionValue>
<enumeratedOptionValue
command="-qnoattr"
id="xlc.c.lm.attr.noattr"
isDefault="false"
name="%Option.attr.noattr">
</enumeratedOptionValue>
<enumeratedOptionValue
command="-qattr=full"
id="xlc.c.lm.attr.fullattr"
isDefault="false"
name="%Option.attr.fullattr">
</enumeratedOptionValue>
<enumeratedOptionValue
command="-qattr"
id="xlc.c.lm.attr.attr"
isDefault="false"
name="%Option.attr.attr">
</enumeratedOptionValue>
</option> </option>
<option <option
category="xlc.c.compiler.category.optimization" category="xlc.c.compiler.category.optimization"

View file

@ -27,17 +27,20 @@ xlc.c.compiler.option.ecd.optdebug=v9.0+
xlc.c.compiler.option.optimization.smp=v8.0,v9.0 xlc.c.compiler.option.optimization.smp=v8.0,v9.0
xlc.c.compiler.option.optimization.smp.v10=v10.1 xlc.c.compiler.option.optimization.smp.v10=v10.1
xlc.c.compiler.option.optimization.strict=v8.0,v9.0 xlc.c.compiler.option.optimization.strict=v8.0,v9.0
xlc.c.compiler.option.optimization.strict.v10=v10.1 xlc.c.compiler.option.optimization.strict.v10=v10.1+
org.eclipse.cdt.managedbuilder.xlc.ui.cpp.option.output.unique.v10=v10.1 org.eclipse.cdt.managedbuilder.xlc.ui.cpp.option.output.unique.v10=v10.1
org.eclipse.cdt.managedbuilder.xlc.ui.cpp.option.namemangling=v8.0,v9.0 org.eclipse.cdt.managedbuilder.xlc.ui.cpp.option.namemangling=v8.0,v9.0
org.eclipse.cdt.managedbuilder.xlc.ui.cpp.option.namemangling.v10=v10.1 org.eclipse.cdt.managedbuilder.xlc.ui.cpp.option.namemangling.v10=v10.1
org.eclipse.cdt.managedbuilder.xlc.ui.cpp.option.output.qconcurrentupdate=v11.1
xlc.c.compiler.option.cc.tls=v8.0,v9.0 xlc.c.compiler.option.cc.tls=v8.0,v9.0
xlc.c.compiler.option.cc.tls.v10=v10.1 xlc.c.compiler.option.cc.tls.v10=v10.1
xlc.c.compiler.option.output.macros=v10.1 xlc.c.compiler.option.output.macros=v10.1
xlc.c.compiler.option.output.timestamps=v10.1 xlc.c.compiler.option.output.timestamps=v10.1
xlc.c.compiler.option.output.qstackprotect=v11.1+ xlc.c.compiler.option.output.qstackprotect=v11.1+
xlc.c.compiler.option.output.enablevmx=v8.0,v9.0,v10.1,v11.1 xlc.c.compiler.option.output.enablevmx=v8.0,v9.0,v10.1,v11.1
xlc.ui.cpp.option.output.qconcurrentupdate
xlc.c.compiler.option.qfunctrace=v11.1+ xlc.c.compiler.option.qfunctrace=v11.1+
xlc.c.compiler.option.optimization.qrestrict=v11.1+
xlc.c.compiler.option.lm.qlistfmt=v11.1+
# END NON-TRANSLATABLE # END NON-TRANSLATABLE