Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java4
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java12
-rw-r--r--core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp6
-rw-r--r--core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java314
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java53
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java278
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java6
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java97
8 files changed, 229 insertions, 541 deletions
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java
index 4999f370e20..effc6869ffe 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder2.java
@@ -91,7 +91,6 @@ import org.eclipse.core.runtime.OperationCanceledException;
public class CModelBuilder2 implements IContributedModelBuilder {
private final TranslationUnit fTranslationUnit;
- private String fTranslationUnitFileName;
private ASTAccessVisibility fCurrentVisibility;
private Stack<ASTAccessVisibility> fVisibilityStack;
private IProgressMonitor fProgressMonitor;
@@ -182,7 +181,6 @@ public class CModelBuilder2 implements IContributedModelBuilder {
* @throws DOMException
*/
private void buildModel(IASTTranslationUnit ast) throws CModelException, DOMException {
- fTranslationUnitFileName= ast.getFilePath();
fVisibilityStack= new Stack<ASTAccessVisibility>();
// includes
@@ -256,7 +254,7 @@ public class CModelBuilder2 implements IContributedModelBuilder {
}
private boolean isLocalToFile(IASTNode node) {
- return fTranslationUnitFileName.equals(node.getContainingFilename());
+ return node.isPartOfTranslationUnitFile();
}
private Include createInclusion(Parent parent, IASTPreprocessorIncludeStatement inclusion, Set<Include> allIncludes) throws CModelException{
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java
index 55dd7370055..f23842f833c 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java
@@ -56,7 +56,7 @@ import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
import org.eclipse.cdt.core.dom.ast.IASTInitializerList;
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
-import org.eclipse.cdt.core.dom.ast.IASTMacroExpansion;
+import org.eclipse.cdt.core.dom.ast.IASTMacroExpansionLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTNode;
@@ -1466,7 +1466,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
}
private int visit(ICPPASTVisiblityLabel node) {
- if (node.getNodeLocations()[0] instanceof IASTMacroExpansion) {
+ if (node.getNodeLocations()[0] instanceof IASTMacroExpansionLocation) {
skipNode(node);
} else {
switch (node.getVisibility()) {
@@ -1911,7 +1911,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
formatLeftCurlyBrace(line, brace_position);
formatOpeningBrace(brace_position, preferences.insert_space_before_opening_brace_in_initializer_list);
if (preferences.insert_new_line_after_opening_brace_in_initializer_list) {
- scribe.printNewLine();
+ scribe.startNewLine();
}
if (preferences.insert_space_after_opening_brace_in_initializer_list) {
scribe.space();
@@ -2751,7 +2751,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
}
IASTNodeLocation[] locations= node.getNodeLocations();
if (locations.length == 0) {
- } else if (locations[0] instanceof IASTMacroExpansion) {
+ } else if (locations[0] instanceof IASTMacroExpansionLocation) {
IASTFileLocation expansionLocation= locations[0].asFileLocation();
int startOffset= expansionLocation.getNodeOffset();
int endOffset= startOffset + expansionLocation.getNodeLength();
@@ -2803,7 +2803,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
IASTNodeLocation[] locations= node.getNodeLocations();
for (int i= 0; i < locations.length; i++) {
IASTNodeLocation nodeLocation= locations[i];
- if (nodeLocation instanceof IASTMacroExpansion) {
+ if (nodeLocation instanceof IASTMacroExpansionLocation) {
IASTFileLocation expansionLocation= nodeLocation.asFileLocation();
int startOffset= expansionLocation.getNodeOffset();
int endOffset= startOffset + expansionLocation.getNodeLength();
@@ -2908,7 +2908,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
IASTNodeLocation[] locations= node.getNodeLocations();
if (locations.length == 0) {
} else if (node instanceof IASTProblemHolder) {
- } else if (locations[0] instanceof IASTMacroExpansion) {
+ } else if (locations[0] instanceof IASTMacroExpansionLocation) {
IASTFileLocation expansionLocation= locations[0].asFileLocation();
IASTFileLocation fileLocation= node.getFileLocation();
return expansionLocation.getNodeOffset() == fileLocation.getNodeOffset();
diff --git a/core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp b/core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp
index 8a86010d10c..2f4cdaf43d9 100644
--- a/core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp
+++ b/core/org.eclipse.cdt.ui.tests/resources/semanticHighlighting/SHTest.cpp
@@ -1,5 +1,6 @@
#define INT int
#define FUNCTION_MACRO(arg) globalFunc(arg)
+#define EMPTY_MACRO(arg)
enum Enumeration {
enumerator
@@ -11,6 +12,7 @@ static int globalStaticVariable = 0;
void globalFunc(int a);
static void globalStaticFunc() {
+ EMPTY_MACRO(n);
};
class Base1 {};
@@ -134,3 +136,7 @@ int f()
{
return n;
}
+
+//http://bugs.eclipse.org/220392
+#define EMPTY
+EMPTY int f();
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java
index 26c70905eed..bbfd2ce2ed6 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/SemanticHighlightingTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * Copyright (c) 2000, 2008 IBM Corporation 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
@@ -39,13 +39,13 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.STATIC_FIELD);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(23, 15, 14),
- createPosition(25, 21, 19),
- createPosition(42, 21, 20),
- createPosition(43, 15, 15),
- createPosition(57, 21, 20),
- createPosition(58, 15, 15),
- createPosition(118, 20, 15),
+ createPosition(25, 15, 14),
+ createPosition(27, 21, 19),
+ createPosition(44, 21, 20),
+ createPosition(45, 15, 15),
+ createPosition(59, 21, 20),
+ createPosition(60, 15, 15),
+ createPosition(120, 20, 15),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -55,31 +55,31 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.FIELD);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(23, 15, 14),
- createPosition(24, 14, 13),
- createPosition(25, 21, 19),
- createPosition(26, 8, 8),
- createPosition(42, 21, 20),
- createPosition(43, 15, 15),
- createPosition(44, 15, 14),
- createPosition(45, 8, 9),
- createPosition(57, 21, 20),
- createPosition(58, 15, 15),
- createPosition(59, 15, 14),
- createPosition(60, 8, 9),
- createPosition(75, 7, 5),
- createPosition(76, 7, 5),
- createPosition(78, 8, 5),
- createPosition(79, 8, 5),
- createPosition(87, 8, 11),
- createPosition(91, 8, 10),
- createPosition(105, 11, 9),
- createPosition(110, 11, 8),
- createPosition(115, 8, 11),
- createPosition(117, 7, 10),
- createPosition(118, 20, 15),
- createPosition(121, 11, 10),
- createPosition(121, 28, 11),
+ createPosition(25, 15, 14),
+ createPosition(26, 14, 13),
+ createPosition(27, 21, 19),
+ createPosition(28, 8, 8),
+ createPosition(44, 21, 20),
+ createPosition(45, 15, 15),
+ createPosition(46, 15, 14),
+ createPosition(47, 8, 9),
+ createPosition(59, 21, 20),
+ createPosition(60, 15, 15),
+ createPosition(61, 15, 14),
+ createPosition(62, 8, 9),
+ createPosition(77, 7, 5),
+ createPosition(78, 7, 5),
+ createPosition(80, 8, 5),
+ createPosition(81, 8, 5),
+ createPosition(89, 8, 11),
+ createPosition(93, 8, 10),
+ createPosition(107, 11, 9),
+ createPosition(112, 11, 8),
+ createPosition(117, 8, 11),
+ createPosition(119, 7, 10),
+ createPosition(120, 20, 15),
+ createPosition(123, 11, 10),
+ createPosition(123, 28, 11),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -89,16 +89,16 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.METHOD_DECLARATION);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(28, 15, 15),
- createPosition(33, 8, 9),
- createPosition(47, 15, 16),
- createPosition(48, 8, 10),
- createPosition(62, 15, 16),
- createPosition(63, 8, 10),
- createPosition(77, 4, 13),
- createPosition(104, 4, 26),
- createPosition(108, 4, 25),
- createPosition(113, 4, 32),
+ createPosition(30, 15, 15),
+ createPosition(35, 8, 9),
+ createPosition(49, 15, 16),
+ createPosition(50, 8, 10),
+ createPosition(64, 15, 16),
+ createPosition(65, 8, 10),
+ createPosition(79, 4, 13),
+ createPosition(106, 4, 26),
+ createPosition(110, 4, 25),
+ createPosition(115, 4, 32),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -107,19 +107,19 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
public void testMethodHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.METHOD);
Position[] expected= new Position[] {
- createPosition(28, 15, 15),
- createPosition(33, 8, 9),
- createPosition(47, 15, 16),
- createPosition(48, 8, 10),
- createPosition(62, 15, 16),
- createPosition(63, 8, 10),
- createPosition(77, 4, 13),
- createPosition(104, 4, 26),
- createPosition(108, 4, 25),
- createPosition(113, 4, 32),
- createPosition(114, 23, 9),
- createPosition(118, 4, 15),
- createPosition(125, 13, 9),
+ createPosition(30, 15, 15),
+ createPosition(35, 8, 9),
+ createPosition(49, 15, 16),
+ createPosition(50, 8, 10),
+ createPosition(64, 15, 16),
+ createPosition(65, 8, 10),
+ createPosition(79, 4, 13),
+ createPosition(106, 4, 26),
+ createPosition(110, 4, 25),
+ createPosition(115, 4, 32),
+ createPosition(116, 23, 9),
+ createPosition(120, 4, 15),
+ createPosition(127, 13, 9),
};
Position[] actual= getSemanticHighlightingPositions();
if (PRINT_POSITIONS) System.out.println(toString(actual));
@@ -129,7 +129,7 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
public void testStaticMethodInvocationHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.STATIC_METHOD_INVOCATION);
Position[] expected= new Position[] {
- createPosition(118, 4, 15),
+ createPosition(120, 4, 15),
};
Position[] actual= getSemanticHighlightingPositions();
if (PRINT_POSITIONS) System.out.println(toString(actual));
@@ -139,10 +139,10 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
public void testLocalVariableDeclarationHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.LOCAL_VARIABLE_DECLARATION);
Position[] expected= new Position[] {
- createPosition(109, 8, 8),
- createPosition(114, 15, 2),
- createPosition(116, 13, 2),
- createPosition(124, 13, 8),
+ createPosition(111, 8, 8),
+ createPosition(116, 15, 2),
+ createPosition(118, 13, 2),
+ createPosition(126, 13, 8),
};
Position[] actual= getSemanticHighlightingPositions();
if (PRINT_POSITIONS) System.out.println(toString(actual));
@@ -152,12 +152,12 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
public void testLocalVariableReferencesHighlighting() throws Exception {
setUpSemanticHighlighting(SemanticHighlightings.LOCAL_VARIABLE);
Position[] expected= new Position[] {
- createPosition(110, 22, 8),
- createPosition(115, 4, 2),
+ createPosition(112, 22, 8),
createPosition(117, 4, 2),
- createPosition(121, 8, 2),
- createPosition(121, 24, 2),
- createPosition(125, 4, 8),
+ createPosition(119, 4, 2),
+ createPosition(123, 8, 2),
+ createPosition(123, 24, 2),
+ createPosition(127, 4, 8),
};
Position[] actual= getSemanticHighlightingPositions();
if (PRINT_POSITIONS) System.out.println(toString(actual));
@@ -168,14 +168,14 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.PARAMETER_VARIABLE);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(11, 20, 1),
- createPosition(28, 35, 3),
- createPosition(29, 23, 3),
- createPosition(30, 19, 3),
- createPosition(77, 21, 4),
- createPosition(77, 30, 4),
- createPosition(78, 16, 4),
- createPosition(79, 16, 4),
+ createPosition(12, 20, 1),
+ createPosition(30, 35, 3),
+ createPosition(31, 23, 3),
+ createPosition(32, 19, 3),
+ createPosition(79, 21, 4),
+ createPosition(79, 30, 4),
+ createPosition(80, 16, 4),
+ createPosition(81, 16, 4),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -185,16 +185,16 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.TEMPLATE_PARAMETER);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(74, 15, 2),
- createPosition(74, 25, 2),
- createPosition(75, 4, 2),
- createPosition(76, 4, 2),
- createPosition(77, 18, 2),
- createPosition(77, 27, 2),
- createPosition(83, 15, 2),
- createPosition(83, 66, 2),
- createPosition(131, 14, 1),
- createPosition(134, 9, 1),
+ createPosition(76, 15, 2),
+ createPosition(76, 25, 2),
+ createPosition(77, 4, 2),
+ createPosition(78, 4, 2),
+ createPosition(79, 18, 2),
+ createPosition(79, 27, 2),
+ createPosition(85, 15, 2),
+ createPosition(85, 66, 2),
+ createPosition(133, 14, 1),
+ createPosition(136, 9, 1),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -204,10 +204,10 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.ENUM);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(3, 5, 11),
- createPosition(35, 9, 14),
- createPosition(50, 9, 15),
- createPosition(65, 9, 15),
+ createPosition(4, 5, 11),
+ createPosition(37, 9, 14),
+ createPosition(52, 9, 15),
+ createPosition(67, 9, 15),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -217,37 +217,37 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.CLASS);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(15, 6, 5),
- createPosition(16, 6, 5),
- createPosition(18, 6, 14),
- createPosition(18, 23, 5),
- createPosition(18, 30, 5),
- createPosition(20, 17, 11),
- createPosition(36, 10, 8),
- createPosition(37, 10, 9),
+ createPosition(17, 6, 5),
+ createPosition(18, 6, 5),
+ createPosition(20, 6, 14),
+ createPosition(20, 23, 5),
+ createPosition(20, 30, 5),
+ createPosition(22, 17, 11),
createPosition(38, 10, 8),
- createPosition(39, 12, 8),
- createPosition(51, 10, 9),
- createPosition(52, 10, 10),
+ createPosition(39, 10, 9),
+ createPosition(40, 10, 8),
+ createPosition(41, 12, 8),
createPosition(53, 10, 9),
- createPosition(54, 12, 9),
- createPosition(66, 10, 9),
- createPosition(67, 10, 10),
+ createPosition(54, 10, 10),
+ createPosition(55, 10, 9),
+ createPosition(56, 12, 9),
createPosition(68, 10, 9),
- createPosition(69, 12, 9),
- createPosition(74, 35, 13),
- createPosition(83, 25, 24),
- createPosition(83, 52, 13),
- createPosition(83, 70, 5),
- createPosition(86, 7, 9),
- createPosition(90, 6, 8),
- createPosition(94, 8, 8),
- createPosition(104, 4, 14),
- createPosition(108, 4, 14),
- createPosition(113, 4, 14),
- createPosition(114, 4, 9),
- createPosition(116, 4, 8),
- createPosition(124, 4, 8),
+ createPosition(69, 10, 10),
+ createPosition(70, 10, 9),
+ createPosition(71, 12, 9),
+ createPosition(76, 35, 13),
+ createPosition(85, 25, 24),
+ createPosition(85, 52, 13),
+ createPosition(85, 70, 5),
+ createPosition(88, 7, 9),
+ createPosition(92, 6, 8),
+ createPosition(96, 8, 8),
+ createPosition(106, 4, 14),
+ createPosition(110, 4, 14),
+ createPosition(115, 4, 14),
+ createPosition(116, 4, 9),
+ createPosition(118, 4, 8),
+ createPosition(126, 4, 8),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -257,11 +257,12 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.FUNCTION_DECLARATION);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(11, 5, 10),
- createPosition(12, 12, 16),
- createPosition(19, 16, 10),
- createPosition(98, 8, 13),
- createPosition(132, 4, 1),
+ createPosition(12, 5, 10),
+ createPosition(13, 12, 16),
+ createPosition(21, 16, 10),
+ createPosition(100, 8, 13),
+ createPosition(134, 4, 1),
+ createPosition(141, 10, 1),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -271,14 +272,15 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.FUNCTION);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(11, 5, 10),
- createPosition(12, 12, 16),
- createPosition(19, 16, 10),
- createPosition(30, 8, 10),
- createPosition(98, 8, 13),
- createPosition(99, 1, 16),
- createPosition(126, 4, 11),
- createPosition(132, 4, 1),
+ createPosition(12, 5, 10),
+ createPosition(13, 12, 16),
+ createPosition(21, 16, 10),
+ createPosition(32, 8, 10),
+ createPosition(100, 8, 13),
+ createPosition(101, 1, 16),
+ createPosition(128, 4, 11),
+ createPosition(134, 4, 1),
+ createPosition(141, 10, 1),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -289,12 +291,12 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.GLOBAL_VARIABLE);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(7, 10, 14),
- createPosition(8, 4, 14),
- createPosition(9, 11, 20),
- createPosition(31, 15, 20),
- createPosition(97, 8, 12),
- createPosition(100, 8, 12),
+ createPosition(8, 10, 14),
+ createPosition(9, 4, 14),
+ createPosition(10, 11, 20),
+ createPosition(33, 15, 20),
+ createPosition(99, 8, 12),
+ createPosition(102, 8, 12),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -306,6 +308,8 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
Position[] expected= new Position[] {
createPosition(0, 8, 3),
createPosition(1, 8, 14),
+ createPosition(2, 8, 11),
+ createPosition(140, 8, 5),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -315,11 +319,13 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.MACRO_REFERENCE);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(29, 8, 14),
- createPosition(104, 0, 3),
- createPosition(108, 0, 3),
- createPosition(113, 0, 3),
- createPosition(120, 4, 14),
+ createPosition(14, 4, 11),
+ createPosition(31, 8, 14),
+ createPosition(106, 0, 3),
+ createPosition(110, 0, 3),
+ createPosition(115, 0, 3),
+ createPosition(122, 4, 14),
+ createPosition(141, 0, 5),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -329,10 +335,10 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.TYPEDEF);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(39, 21, 10),
- createPosition(54, 22, 11),
- createPosition(69, 22, 11),
- createPosition(94, 17, 6),
+ createPosition(41, 21, 10),
+ createPosition(56, 22, 11),
+ createPosition(71, 22, 11),
+ createPosition(96, 17, 6),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -342,7 +348,7 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.NAMESPACE);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(96, 10, 2),
+ createPosition(98, 10, 2),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -352,8 +358,8 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.LABEL);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(119, 0, 5),
- createPosition(121, 46, 5),
+ createPosition(121, 0, 5),
+ createPosition(123, 46, 5),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -363,10 +369,10 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.ENUMERATOR);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(4, 4, 10),
- createPosition(35, 25, 13),
- createPosition(50, 26, 14),
- createPosition(65, 26, 14),
+ createPosition(5, 4, 10),
+ createPosition(37, 25, 13),
+ createPosition(52, 26, 14),
+ createPosition(67, 26, 14),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -376,7 +382,7 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.PROBLEM);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(122, 4, 13),
+ createPosition(124, 4, 13),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
@@ -386,8 +392,8 @@ public class SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
setUpSemanticHighlighting(SemanticHighlightings.EXTERNAL_SDK);
Position[] actual= getSemanticHighlightingPositions();
Position[] expected= new Position[] {
- createPosition(125, 13, 9),
- createPosition(126, 4, 11),
+ createPosition(127, 13, 9),
+ createPosition(128, 4, 11),
};
if (PRINT_POSITIONS) System.out.println(toString(actual));
assertEqualPositions(expected, actual);
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
index 7713a633c15..2ec01ca5487 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
@@ -158,12 +158,10 @@ import com.ibm.icu.text.BreakIterator;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CCorePreferenceConstants;
-import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IASTNodeSelector;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.cdt.core.model.CModelException;
@@ -3079,48 +3077,15 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
OccurrenceLocation[] locations= null;
- IASTNode selectedNode= astRoot.selectNodeForLocation(astRoot.getFilePath(), wordRegion.getOffset(), wordRegion.getLength());
- if (selectedNode == null && astRoot instanceof ICPPASTTranslationUnit && wordRegion.getOffset() > 0) {
- // destructor?
- try {
- if (document.getChar(wordRegion.getOffset() - 1) == '~') {
- selectedNode= astRoot.selectNodeForLocation(astRoot.getFilePath(), wordRegion.getOffset() - 1, wordRegion.getLength() + 1);
- }
- } catch (BadLocationException exc) {
- // should not happen
- }
- }
- final class NameFinder extends ASTVisitor {
- private IASTName fName;
-
- public NameFinder() {
- shouldVisitNames= true;
- }
- public int visit(IASTName name) {
- fName= name;
- return PROCESS_ABORT;
- }
- public IASTName getName() {
- return fName;
- }
- }
+ IASTNodeSelector selector= astRoot.getNodeSelector(astRoot.getFilePath());
+ IASTName name= selector.findSurroundingName(wordRegion.getOffset(), wordRegion.getLength());
- if (selectedNode != null) {
- IASTName name;
- if (selectedNode instanceof IASTName) {
- name= (IASTName) selectedNode;
- } else {
- NameFinder nameFinder= new NameFinder();
- selectedNode.accept(nameFinder);
- name= nameFinder.getName();
- }
- if (name != null) {
- IBinding binding= name.resolveBinding();
- if (binding != null) {
- OccurrencesFinder occurrencesFinder= new OccurrencesFinder();
- if (occurrencesFinder.initialize(astRoot, name) == null) {
- locations= occurrencesFinder.getOccurrences();
- }
+ if (name != null) {
+ IBinding binding= name.resolveBinding();
+ if (binding != null) {
+ OccurrencesFinder occurrencesFinder= new OccurrencesFinder();
+ if (occurrencesFinder.initialize(astRoot, name) == null) {
+ locations= occurrencesFinder.getOccurrences();
}
}
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java
index bdb33e94e38..b818e4d80f3 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java
@@ -29,32 +29,22 @@ import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
-import org.eclipse.cdt.core.dom.ast.IASTExpression;
-import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTImageLocation;
-import org.eclipse.cdt.core.dom.ast.IASTInitializer;
-import org.eclipse.cdt.core.dom.ast.IASTMacroExpansion;
+import org.eclipse.cdt.core.dom.ast.IASTMacroExpansionLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
-import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion;
-import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
-import org.eclipse.cdt.core.dom.ast.IASTTypeId;
-import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.ui.CUIPlugin;
@@ -75,108 +65,6 @@ import org.eclipse.cdt.internal.ui.text.ICReconcilingListener;
public class SemanticHighlightingReconciler implements ICReconcilingListener {
/**
- * AST visitor to test whether a node is a leaf node.
- */
- public static final class ChildNodeFinder extends CPPASTVisitor {
- {
- shouldVisitNames= true;
- shouldVisitDeclarations= true;
- shouldVisitInitializers= true;
- shouldVisitParameterDeclarations= true;
- shouldVisitDeclarators= true;
- shouldVisitDeclSpecifiers= true;
- shouldVisitExpressions= true;
- shouldVisitStatements= true;
- shouldVisitTypeIds= true;
- shouldVisitEnumerators= true;
- shouldVisitTranslationUnit= false;
- shouldVisitProblems= true;
- shouldVisitBaseSpecifiers= true;
- shouldVisitNamespaces= true;
- shouldVisitTemplateParameters= true;
- }
- private int fVisits;
- private int fFirstChildOffset;
-
- private int processNode(IASTNode node) {
- if (++fVisits > 1) {
- final IASTFileLocation fileLocation = node.getFileLocation();
- if (fileLocation != null) {
- fFirstChildOffset= fileLocation.getNodeOffset();
- return PROCESS_ABORT;
- }
- }
- return PROCESS_CONTINUE;
- }
- @Override
- public int visit(ICPPASTBaseSpecifier specifier) {
- return processNode(specifier);
- }
- @Override
- public int visit(ICPPASTNamespaceDefinition namespace) {
- return processNode(namespace);
- }
- @Override
- public int visit(ICPPASTTemplateParameter parameter) {
- return processNode(parameter);
- }
- @Override
- public int visit(IASTDeclaration declaration) {
- return processNode(declaration);
- }
- @Override
- public int visit(IASTDeclarator declarator) {
- return processNode(declarator);
- }
- @Override
- public int visit(IASTDeclSpecifier declSpec) {
- return processNode(declSpec);
- }
- @Override
- public int visit(IASTEnumerator enumerator) {
- return processNode(enumerator);
- }
- @Override
- public int visit(IASTExpression expression) {
- return processNode(expression);
- }
- @Override
- public int visit(IASTInitializer initializer) {
- return processNode(initializer);
- }
- @Override
- public int visit(IASTName name) {
- return processNode(name);
- }
- @Override
- public int visit(IASTParameterDeclaration parameterDeclaration) {
- return processNode(parameterDeclaration);
- }
- @Override
- public int visit(IASTProblem problem) {
- return processNode(problem);
- }
- @Override
- public int visit(IASTStatement statement) {
- return processNode(statement);
- }
- @Override
- public int visit(IASTTranslationUnit tu) {
- return processNode(tu);
- }
- @Override
- public int visit(IASTTypeId typeId) {
- return processNode(typeId);
- }
- public int getFirstChildOffset(IASTNode node) {
- fVisits= 0;
- fFirstChildOffset= Integer.MAX_VALUE;
- node.accept(this);
- return fFirstChildOffset;
- }
- }
-
- /**
* Collects positions from the AST.
*/
private class PositionCollector extends CPPASTVisitor {
@@ -186,7 +74,6 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
shouldVisitDeclarations= true;
shouldVisitExpressions= true;
shouldVisitStatements= true;
- shouldVisitDeclSpecifiers= true;
shouldVisitDeclarators= true;
shouldVisitNamespaces= true;
}
@@ -194,9 +81,7 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
/** The semantic token */
private SemanticToken fToken= new SemanticToken();
- private String fFilePath;
private int fMinLocation;
- private final ChildNodeFinder fgChildNodeFinder= new ChildNodeFinder();
public PositionCollector() {
fMinLocation= -1;
@@ -207,7 +92,6 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
*/
@Override
public int visit(IASTTranslationUnit tu) {
- fFilePath= tu.getFilePath();
// visit macro definitions
IASTPreprocessorMacroDefinition[] macroDefs= tu.getMacroDefinitions();
@@ -217,14 +101,25 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
visitNode(macroDef.getName());
}
}
- // TODO visit macro expansions
-// IASTName[] macroExps= tu.getMacroExpansions();
-// for (int i= 0; i < macroExps.length; i++) {
-// IASTName macroExp= macroExps[i];
-// if (macroExp.isPartOfTranslationUnitFile()) {
-// visitMacroExpansion(macroExp);
-// }
-// }
+ fMinLocation= -1;
+
+ // visit macro expansions
+ IASTPreprocessorMacroExpansion[] macroExps= tu.getMacroExpansions();
+ for (int i= 0; i < macroExps.length; i++) {
+ IASTPreprocessorMacroExpansion macroExp= macroExps[i];
+ if (macroExp.isPartOfTranslationUnitFile()) {
+ IASTName macroRef= macroExp.getMacroReference();
+ visitNode(macroRef);
+ IASTName[] nestedMacroRefs= macroExp.getNestedMacroReferences();
+ for (int j= 0; j < nestedMacroRefs.length; j++) {
+ IASTName nestedMacroRef= nestedMacroRefs[j];
+ visitNode(nestedMacroRef);
+ }
+ }
+ }
+ fMinLocation= -1;
+
+ // visit ordinary code
return super.visit(tu);
}
@@ -236,9 +131,6 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
if (!declaration.isPartOfTranslationUnitFile()) {
return PROCESS_SKIP;
}
- if (checkForMacro(declaration)) {
- return PROCESS_SKIP;
- }
return PROCESS_CONTINUE;
}
@@ -267,20 +159,6 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
if (!namespace.isPartOfTranslationUnitFile()) {
return PROCESS_SKIP;
}
- if (checkForMacro(namespace)) {
- return PROCESS_SKIP;
- }
- return PROCESS_CONTINUE;
- }
-
- /*
- * @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier)
- */
- @Override
- public int visit(IASTDeclSpecifier declSpec) {
- if (checkForMacro(declSpec)) {
- return PROCESS_SKIP;
- }
return PROCESS_CONTINUE;
}
@@ -289,9 +167,6 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
*/
@Override
public int visit(IASTDeclarator declarator) {
- if (checkForMacro(declarator)) {
- return PROCESS_SKIP;
- }
if (declarator instanceof ICPPASTFunctionTryBlockDeclarator) {
shouldVisitCatchHandlers= false;
}
@@ -299,17 +174,6 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
}
/*
- * @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTExpression)
- */
- @Override
- public int visit(IASTExpression expression) {
- if (checkForMacro(expression)) {
- return PROCESS_SKIP;
- }
- return PROCESS_CONTINUE;
- }
-
- /*
* @see org.eclipse.cdt.core.dom.ast.ASTVisitor#visit(org.eclipse.cdt.core.dom.ast.IASTStatement)
*/
@Override
@@ -317,9 +181,6 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
if (!shouldVisitCatchHandlers && statement instanceof ICPPASTCatchHandler) {
return PROCESS_SKIP;
}
- if (checkForMacro(statement)) {
- return PROCESS_SKIP;
- }
return PROCESS_CONTINUE;
}
@@ -328,69 +189,12 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
*/
@Override
public int visit(IASTName name) {
- if (checkForMacro(name)) {
- return PROCESS_SKIP;
- }
if (visitNode(name)) {
return PROCESS_SKIP;
}
return PROCESS_CONTINUE;
}
- private boolean checkForMacro(IASTNode node) {
- int firstChildOffset= fgChildNodeFinder.getFirstChildOffset(node);
- IASTNodeLocation[] nodeLocations= node.getNodeLocations();
- for (int i= 0; i < nodeLocations.length; i++) {
- IASTNodeLocation nodeLocation= nodeLocations[i];
- if (nodeLocation instanceof IASTMacroExpansion) {
- IASTNodeLocation useLocation= nodeLocation.asFileLocation();
- if (useLocation != null) {
- final int useOffset = useLocation.getNodeOffset();
- if (useOffset > firstChildOffset) {
- break;
- }
- if (useOffset > fMinLocation) {
- fMinLocation= useOffset;
- IASTPreprocessorMacroDefinition macroDef= ((IASTMacroExpansion)nodeLocation).getMacroDefinition();
- final int macroLength;
- IASTNodeLocation defLocation= macroDef.getName().getFileLocation();
- if (defLocation != null) {
- macroLength= defLocation.getNodeLength();
- } else {
- macroLength= macroDef.getName().toCharArray().length;
- }
- IASTNode macroNode= node.getTranslationUnit().selectNodeForLocation(fFilePath, useOffset, macroLength);
- if (macroNode instanceof IASTPreprocessorMacroExpansion) {
- macroNode= ((IASTPreprocessorMacroExpansion) macroNode).getMacroReference();
- }
- if (macroNode != null && visitMacro(macroNode, macroLength)) {
- fMinLocation= useOffset + macroLength;
- }
- }
- }
- }
- }
- return false;
- }
-
- private boolean visitMacro(IASTNode node, int macroLength) {
- fToken.update(node);
- for (int i= 0, n= fJobSemanticHighlightings.length; i < n; ++i) {
- SemanticHighlighting semanticHighlighting= fJobSemanticHighlightings[i];
- if (fJobHighlightings[i].isEnabled() && semanticHighlighting.consumes(fToken)) {
- if (node instanceof IASTName) {
- addNameLocation((IASTName)node, fJobHighlightings[i]);
- } else {
- addMacroLocation(node.getFileLocation(), macroLength, fJobHighlightings[i]);
- }
- break;
- }
- }
- fToken.clear();
- // always consume this node
- return true;
- }
-
private boolean visitNode(IASTNode node) {
boolean consumed= false;
fToken.update(node);
@@ -418,16 +222,23 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
*/
private void addNameLocation(IASTName name, HighlightingStyle highlightingStyle) {
IASTImageLocation imageLocation= name.getImageLocation();
- if (imageLocation == null || !fFilePath.equals(imageLocation.getFileName())) {
- addNodeLocation(name.getFileLocation(), highlightingStyle);
- } else {
- int offset= imageLocation.getNodeOffset();
- if (offset >= fMinLocation) {
- int length= imageLocation.getNodeLength();
- if (offset > -1 && length > 0) {
- addPosition(offset, length, highlightingStyle);
+ if (imageLocation != null) {
+ if (imageLocation.getLocationKind() != IASTImageLocation.MACRO_DEFINITION) {
+ int offset= imageLocation.getNodeOffset();
+ if (offset >= fMinLocation) {
+ int length= imageLocation.getNodeLength();
+ if (offset > -1 && length > 0) {
+ fMinLocation= offset + length;
+ addPosition(offset, length, highlightingStyle);
+ }
}
}
+ } else {
+ // fallback in case no image location available
+ IASTNodeLocation[] nodeLocations= name.getNodeLocations();
+ if (nodeLocations.length == 1 && !(nodeLocations[0] instanceof IASTMacroExpansionLocation)) {
+ addNodeLocation(nodeLocations[0], highlightingStyle);
+ }
}
}
@@ -445,30 +256,13 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
if (offset >= fMinLocation) {
int length= nodeLocation.getNodeLength();
if (offset > -1 && length > 0) {
+ fMinLocation= offset + length;
addPosition(offset, length, highlighting);
}
}
}
/**
- * Add the a location range for the given macro highlighting.
- *
- * @param macroUseLocaton The location of the macro occurrence
- * @param macroLength the length of the macro name
- * @param highlighting The highlighting
- */
- private void addMacroLocation(IASTNodeLocation macroUseLocation, int macroLength, HighlightingStyle highlighting) {
- if (macroUseLocation == null) {
- return;
- }
- int offset= macroUseLocation.getNodeOffset();
- int length= macroLength;
- if (offset > -1 && length > 0) {
- addPosition(offset, length, highlighting);
- }
- }
-
- /**
* Add a position with the given range and highlighting iff it does not exist already.
*
* @param offset The range offset
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java
index 86e92a412a6..00fa769a754 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java
@@ -30,7 +30,7 @@ public class OccurrencesFinder implements IOccurrencesFinder {
private IASTName fSelectedNode;
private IBinding fTarget;
- private List/*<OccurrenceLocation>*/fResult;
+ private List<OccurrenceLocation> fResult;
private String fDescription;
public OccurrencesFinder() {
@@ -52,7 +52,7 @@ public class OccurrencesFinder implements IOccurrencesFinder {
private void performSearch() {
if (fResult == null) {
- fResult= new ArrayList/*<OccurrenceLocation>*/();
+ fResult= new ArrayList<OccurrenceLocation>();
IASTName[] names= fRoot.getDeclarationsInAST(fTarget);
for (int i= 0; i < names.length; i++) {
IASTName candidate= names[i];
@@ -74,7 +74,7 @@ public class OccurrencesFinder implements IOccurrencesFinder {
performSearch();
if (fResult.isEmpty())
return null;
- return (OccurrenceLocation[]) fResult.toArray(new OccurrenceLocation[fResult.size()]);
+ return fResult.toArray(new OccurrenceLocation[fResult.size()]);
}
public IASTTranslationUnit getASTRoot() {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java
index 16252df8ed2..f38b19174ed 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java
@@ -28,16 +28,13 @@ import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.cdt.core.dom.ast.ASTVisitor;
-import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
-import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
-import org.eclipse.cdt.core.dom.ast.IASTMacroExpansion;
+import org.eclipse.cdt.core.dom.ast.IASTMacroExpansionLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
+import org.eclipse.cdt.core.dom.ast.IASTNodeSelector;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion;
-import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
@@ -62,81 +59,6 @@ import org.eclipse.cdt.internal.ui.text.CHeuristicScanner;
public class CMacroExpansionInput {
/**
- * AST visitor to find a node (declaration, statement or expression) enclosing a given source range.
- */
- private static class FindEnclosingNodeAction extends ASTVisitor {
- {
- shouldVisitTranslationUnit= true;
- shouldVisitDeclarations = true;
- shouldVisitStatements = true;
- shouldVisitExpressions = true;
- }
-
- private final int fOffset;
- private final int fEndOffset;
- private final String fFilePath;
- private IASTNode fBestMatch= null;
- private int fBestOffset= -1;
- private int fBestEndOffset= Integer.MAX_VALUE;
-
- public FindEnclosingNodeAction(String filePath, int offset, int length) {
- fFilePath= filePath;
- fOffset= offset;
- fEndOffset= offset + length;
- }
-
- private int processNode(IASTNode node) {
- IASTFileLocation location= node.getFileLocation();
- if (location != null && fFilePath.equals(location.getFileName())) {
- final int startOffset = location.getNodeOffset();
- if (startOffset <= fOffset) {
- int endOffset= startOffset + location.getNodeLength();
- if (endOffset >= fEndOffset || node instanceof IASTTranslationUnit) {
- if (startOffset > fBestOffset || endOffset < fBestEndOffset) {
- fBestMatch= node;
- fBestOffset= startOffset;
- fBestEndOffset= endOffset;
- boolean isPerfectMatch= startOffset == fOffset || endOffset == fEndOffset;
- if (isPerfectMatch) {
- return PROCESS_ABORT;
- }
- }
- } else {
- return PROCESS_SKIP;
- }
- } else {
- return PROCESS_ABORT;
- }
- }
- return PROCESS_CONTINUE;
- }
-
- @Override
- public int visit(IASTTranslationUnit tu) {
- return processNode(tu);
- }
-
- @Override
- public int visit(IASTDeclaration declaration) {
- return processNode(declaration);
- }
-
- @Override
- public int visit(IASTExpression expression) {
- return processNode(expression);
- }
-
- @Override
- public int visit(IASTStatement statement) {
- return processNode(statement);
- }
-
- public IASTNode getNode() {
- return fBestMatch;
- }
- }
-
- /**
* Computes the expansion region for a selection.
*/
private static class ExpansionRegionComputer implements ASTRunnable {
@@ -157,8 +79,9 @@ public class CMacroExpansionInput {
*/
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
if (ast != null) {
- // try macro name match first
- IASTNode node= ast.selectNodeForLocation(ast.getFilePath(), fTextRegion.getOffset(), fTextRegion.getLength());
+ final IASTNodeSelector nodeSelector = ast.getNodeSelector(ast.getFilePath());
+ // try exact macro name match first
+ IASTNode node= nodeSelector.findName(fTextRegion.getOffset(), fTextRegion.getLength());
if (node instanceof IASTName) {
IASTName macroName= (IASTName) node;
IBinding binding= macroName.getBinding();
@@ -172,21 +95,17 @@ public class CMacroExpansionInput {
}
if (fAllowSelection) {
// selection
- FindEnclosingNodeAction nodeFinder= new FindEnclosingNodeAction(ast.getFilePath(), fTextRegion.getOffset(), fTextRegion.getLength());
- ast.accept(nodeFinder);
- fEnclosingNode= nodeFinder.getNode();
+ fEnclosingNode= nodeSelector.findSurroundingNode(fTextRegion.getOffset(), fTextRegion.getLength());
if (fEnclosingNode != null) {
boolean macroOccurrence= false;
IASTNodeLocation[] locations= fEnclosingNode.getNodeLocations();
for (int i = 0; i < locations.length; i++) {
IASTNodeLocation location= locations[i];
- if (location instanceof IASTMacroExpansion) {
+ if (location instanceof IASTMacroExpansionLocation) {
IASTFileLocation fileLocation= location.asFileLocation();
if (fileLocation != null && ast.getFilePath().equals(fileLocation.getFileName())) {
if (fTextRegion.overlapsWith(fileLocation.getNodeOffset(), fileLocation.getNodeLength())) {
- nodeFinder= new FindEnclosingNodeAction(ast.getFilePath(), fileLocation.getNodeOffset(), fileLocation.getNodeLength());
- ast.accept(nodeFinder);
- addExpansionNode(nodeFinder.getNode());
+ addExpansionNode(nodeSelector.findSurroundingNode(fileLocation.getNodeOffset(), fileLocation.getNodeLength()));
macroOccurrence= true;
}
}

Back to the top