mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-04 23:05:47 +02:00
Fix for Bug 149569 - PDom does not store inactive include directives
and Bug 149568 - PDom does not store unresolved include directives
This commit is contained in:
parent
223b2e56e8
commit
1ae5457603
22 changed files with 436 additions and 129 deletions
|
@ -1,5 +1,5 @@
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
* Copyright (c) 2006, 2007 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
|
||||||
|
@ -7,6 +7,7 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.managedbuilder.pdomdepgen;
|
package org.eclipse.cdt.managedbuilder.pdomdepgen;
|
||||||
|
@ -67,9 +68,11 @@ public class PDOMDependencyCalculator implements IManagedDependencyCalculator {
|
||||||
IIndexInclude[] includes = index.findIncludes(file, IIndex.DEPTH_INFINITE);
|
IIndexInclude[] includes = index.findIncludes(file, IIndex.DEPTH_INFINITE);
|
||||||
|
|
||||||
List/*<IPath>*/ list = new ArrayList/*<IPath>*/();
|
List/*<IPath>*/ list = new ArrayList/*<IPath>*/();
|
||||||
for (int i = 0; i < includes.length; ++i)
|
for (int i = 0; i < includes.length; ++i) {
|
||||||
list.add(IndexLocationFactory.getAbsolutePath(includes[i].getIncludesLocation()));
|
if (includes[i].isResolved()) {
|
||||||
|
list.add(IndexLocationFactory.getAbsolutePath(includes[i].getIncludesLocation()));
|
||||||
|
}
|
||||||
|
}
|
||||||
dependencies = (IPath[])list.toArray(new IPath[list.size()]);
|
dependencies = (IPath[])list.toArray(new IPath[list.size()]);
|
||||||
} else
|
} else
|
||||||
dependencies = new IPath[0];
|
dependencies = new IPath[0];
|
||||||
|
|
|
@ -465,7 +465,6 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
public void testBug162180() throws Exception {
|
public void testBug162180() throws Exception {
|
||||||
StringBuffer buffer = new StringBuffer();
|
StringBuffer buffer = new StringBuffer();
|
||||||
buffer.append( "#include <notfound.h>\n"); //$NON-NLS-1$
|
buffer.append( "#include <notfound.h>\n"); //$NON-NLS-1$
|
||||||
int declOffset= buffer.length();
|
|
||||||
buffer.append( "int x;\n"); //$NON-NLS-1$
|
buffer.append( "int x;\n"); //$NON-NLS-1$
|
||||||
String code = buffer.toString();
|
String code = buffer.toString();
|
||||||
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
|
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
|
||||||
|
@ -474,7 +473,7 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
IASTDeclaration[] decls= tu.getDeclarations();
|
IASTDeclaration[] decls= tu.getDeclarations();
|
||||||
assertEquals( decls.length, 1 );
|
assertEquals( decls.length, 1 );
|
||||||
IASTPreprocessorStatement [] statements = tu.getAllPreprocessorStatements();
|
IASTPreprocessorStatement [] statements = tu.getAllPreprocessorStatements();
|
||||||
assertEquals( statements.length, 0 );
|
assertEquals( statements.length, 1 );
|
||||||
IASTProblem[] problems = tu.getPreprocessorProblems();
|
IASTProblem[] problems = tu.getPreprocessorProblems();
|
||||||
assertEquals( problems.length, 1 );
|
assertEquals( problems.length, 1 );
|
||||||
assertSoleLocation( decls[0], code, "int x;");
|
assertSoleLocation( decls[0], code, "int x;");
|
||||||
|
@ -494,7 +493,6 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
buffer.append( "#include <notfound.h>\n"); //$NON-NLS-1$
|
buffer.append( "#include <notfound.h>\n"); //$NON-NLS-1$
|
||||||
buffer.append( "#include <notfound1.h> \r\n"); //$NON-NLS-1$
|
buffer.append( "#include <notfound1.h> \r\n"); //$NON-NLS-1$
|
||||||
buffer.append( "#include <notfound2.h> // more stuff \n"); //$NON-NLS-1$
|
buffer.append( "#include <notfound2.h> // more stuff \n"); //$NON-NLS-1$
|
||||||
int declOffset= buffer.length();
|
|
||||||
buffer.append( "int x;\n"); //$NON-NLS-1$
|
buffer.append( "int x;\n"); //$NON-NLS-1$
|
||||||
String code = buffer.toString();
|
String code = buffer.toString();
|
||||||
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
|
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
|
||||||
|
@ -504,12 +502,12 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
IASTPreprocessorStatement [] statements = tu.getAllPreprocessorStatements();
|
IASTPreprocessorStatement [] statements = tu.getAllPreprocessorStatements();
|
||||||
IASTProblem[] problems = tu.getPreprocessorProblems();
|
IASTProblem[] problems = tu.getPreprocessorProblems();
|
||||||
assertEquals( 1, decls.length);
|
assertEquals( 1, decls.length);
|
||||||
assertEquals( 0, statements.length);
|
assertEquals( 3, statements.length);
|
||||||
assertEquals( 3, problems.length);
|
assertEquals( 3, problems.length);
|
||||||
String snip= "<notfound.h>";
|
String snip= "<notfound.h>";
|
||||||
assertSoleLocation(problems[0], code, "#include <notfound.h>");
|
assertSoleLocation(statements[0], code, "#include <notfound.h>");
|
||||||
assertSoleLocation(problems[1], code, "#include <notfound1.h> ");
|
assertSoleLocation(statements[1], code, "#include <notfound1.h>");
|
||||||
assertSoleLocation(problems[2], code, "#include <notfound2.h> // more stuff ");
|
assertSoleLocation(statements[2], code, "#include <notfound2.h>");
|
||||||
assertSoleLocation(decls[0], code, "int x;");
|
assertSoleLocation(decls[0], code, "int x;");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -590,7 +588,7 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
IASTPreprocessorStatement [] statements = tu.getAllPreprocessorStatements();
|
IASTPreprocessorStatement [] statements = tu.getAllPreprocessorStatements();
|
||||||
IASTProblem[] problems = tu.getPreprocessorProblems();
|
IASTProblem[] problems = tu.getPreprocessorProblems();
|
||||||
assertEquals( 1, decls.length);
|
assertEquals( 1, decls.length);
|
||||||
assertEquals( 0, statements.length);
|
assertEquals( 1, statements.length);
|
||||||
assertEquals( 2, problems.length);
|
assertEquals( 2, problems.length);
|
||||||
assertSoleLocation(problems[0], code, "#include \"\"");
|
assertSoleLocation(problems[0], code, "#include \"\"");
|
||||||
assertSoleLocation(problems[1], code, "else");
|
assertSoleLocation(problems[1], code, "else");
|
||||||
|
|
|
@ -210,7 +210,62 @@ public class IndexIncludeTest extends IndexTestBase {
|
||||||
TestScannerProvider.sIncludes= null;
|
TestScannerProvider.sIncludes= null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testInactiveInclude() throws Exception {
|
||||||
|
TestScannerProvider.sIncludes= new String[]{fProject.getProject().getLocation().toOSString()};
|
||||||
|
try {
|
||||||
|
String content = "#if 0\n#include \"inactive20070213.h\"\n#endif\n";
|
||||||
|
IFile file= TestSourceReader.createFile(fProject.getProject(), "source20070213.cpp", content);
|
||||||
|
CCoreInternals.getPDOMManager().reindex(fProject);
|
||||||
|
waitForIndexer();
|
||||||
|
|
||||||
|
fIndex.acquireReadLock();
|
||||||
|
try {
|
||||||
|
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
|
||||||
|
assertNotNull(ifile);
|
||||||
|
IIndexInclude[] includes= ifile.getIncludes();
|
||||||
|
assertEquals(1, includes.length);
|
||||||
|
|
||||||
|
assertFalse(includes[0].isActive());
|
||||||
|
checkInclude(includes[0], content, "inactive20070213.h", false);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
fIndex.releaseReadLock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
TestScannerProvider.sIncludes= null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testUnresolvedInclude() throws Exception {
|
||||||
|
TestScannerProvider.sIncludes= new String[]{fProject.getProject().getLocation().toOSString()};
|
||||||
|
try {
|
||||||
|
String content = "#include \"unresolved20070213.h\"\n";
|
||||||
|
IFile file= TestSourceReader.createFile(fProject.getProject(), "source20070214.cpp", content);
|
||||||
|
CCoreInternals.getPDOMManager().reindex(fProject);
|
||||||
|
waitForIndexer();
|
||||||
|
|
||||||
|
fIndex.acquireReadLock();
|
||||||
|
try {
|
||||||
|
IIndexFile ifile= fIndex.getFile(IndexLocationFactory.getWorkspaceIFL(file));
|
||||||
|
assertNotNull(ifile);
|
||||||
|
IIndexInclude[] includes= ifile.getIncludes();
|
||||||
|
assertEquals(1, includes.length);
|
||||||
|
|
||||||
|
assertTrue(includes[0].isActive());
|
||||||
|
assertFalse(includes[0].isResolved());
|
||||||
|
checkInclude(includes[0], content, "unresolved20070213.h", false);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
fIndex.releaseReadLock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
TestScannerProvider.sIncludes= null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void checkInclude(IIndexInclude include, String content, String includeName, boolean isSystem) throws CoreException {
|
private void checkInclude(IIndexInclude include, String content, String includeName, boolean isSystem) throws CoreException {
|
||||||
int offset= content.indexOf(includeName);
|
int offset= content.indexOf(includeName);
|
||||||
assertEquals(offset, include.getNameOffset());
|
assertEquals(offset, include.getNameOffset());
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2000, 2006 QNX Software Systems and others.
|
* Copyright (c) 2000, 2007 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
|
||||||
|
@ -7,6 +7,7 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.core.model;
|
package org.eclipse.cdt.core.model;
|
||||||
|
|
||||||
|
@ -32,4 +33,15 @@ public interface IInclude extends ICElement, ISourceReference, ISourceManipulati
|
||||||
public String getFullFileName();
|
public String getFullFileName();
|
||||||
|
|
||||||
public boolean isLocal();
|
public boolean isLocal();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return whether this include directive is in active code, ie. not hidden
|
||||||
|
* by conditional compilation
|
||||||
|
*/
|
||||||
|
public boolean isActive();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return whether this include directive was resolved and followed.
|
||||||
|
*/
|
||||||
|
boolean isResolved();
|
||||||
}
|
}
|
||||||
|
|
|
@ -296,16 +296,6 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
||||||
createInclusion(fTranslationUnit, includeDirective);
|
createInclusion(fTranslationUnit, includeDirective);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// problem includes
|
|
||||||
final IASTProblem[] ppProblems= ast.getPreprocessorProblems();
|
|
||||||
for (int i= 0; i < ppProblems.length; i++) {
|
|
||||||
IASTProblem problem= ppProblems[i];
|
|
||||||
if (problem.getID() == IASTProblem.PREPROCESSOR_INCLUSION_NOT_FOUND) {
|
|
||||||
if (isLocalToFile(problem)) {
|
|
||||||
createProblemInclusion(fTranslationUnit, problem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// macros
|
// macros
|
||||||
final IASTPreprocessorMacroDefinition[] macroDefinitions= ast.getMacroDefinitions();
|
final IASTPreprocessorMacroDefinition[] macroDefinitions= ast.getMacroDefinitions();
|
||||||
for (int i= 0; i < macroDefinitions.length; i++) {
|
for (int i= 0; i < macroDefinitions.length; i++) {
|
||||||
|
@ -347,6 +337,7 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
||||||
}
|
}
|
||||||
if (problemRequestor != null && problemRequestor.isActive()) {
|
if (problemRequestor != null && problemRequestor.isActive()) {
|
||||||
problemRequestor.beginReporting();
|
problemRequestor.beginReporting();
|
||||||
|
final IASTProblem[] ppProblems= ast.getPreprocessorProblems();
|
||||||
IASTProblem[] problems= ppProblems;
|
IASTProblem[] problems= ppProblems;
|
||||||
for (int i= 0; i < problems.length; i++) {
|
for (int i= 0; i < problems.length; i++) {
|
||||||
IASTProblem problem= problems[i];
|
IASTProblem problem= problems[i];
|
||||||
|
@ -378,6 +369,8 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
||||||
final IASTName name= inclusion.getName();
|
final IASTName name= inclusion.getName();
|
||||||
Include element= new Include(parent, ASTStringUtil.getSimpleName(name), inclusion.isSystemInclude());
|
Include element= new Include(parent, ASTStringUtil.getSimpleName(name), inclusion.isSystemInclude());
|
||||||
element.setFullPathName(inclusion.getPath());
|
element.setFullPathName(inclusion.getPath());
|
||||||
|
element.setActive(inclusion.isActive());
|
||||||
|
element.setResolved(inclusion.isResolved());
|
||||||
// add to parent
|
// add to parent
|
||||||
parent.addChild(element);
|
parent.addChild(element);
|
||||||
// set positions
|
// set positions
|
||||||
|
@ -386,35 +379,6 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Include createProblemInclusion(Parent parent, IASTProblem problem) throws CModelException {
|
|
||||||
// create element
|
|
||||||
String name= problem.getArguments();
|
|
||||||
if (name == null || name.length() == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
String signature= problem.getRawSignature();
|
|
||||||
int nameIdx= signature.indexOf(name);
|
|
||||||
boolean isStandard= false;
|
|
||||||
if (nameIdx > 0) {
|
|
||||||
isStandard= signature.charAt(nameIdx-1) == '<';
|
|
||||||
}
|
|
||||||
Include element= new Include(parent, name, isStandard);
|
|
||||||
// add to parent
|
|
||||||
parent.addChild(element);
|
|
||||||
// set positions
|
|
||||||
if (nameIdx > 0) {
|
|
||||||
final IASTFileLocation problemLocation= problem.getFileLocation();
|
|
||||||
if (problemLocation != null) {
|
|
||||||
final int startOffset= problemLocation.getNodeOffset();
|
|
||||||
element.setIdPos(startOffset + nameIdx, name.length());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setIdentifierPosition(element, problem);
|
|
||||||
}
|
|
||||||
setBodyPosition(element, problem);
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Macro createMacro(Parent parent, IASTPreprocessorMacroDefinition macro) throws CModelException{
|
private Macro createMacro(Parent parent, IASTPreprocessorMacroDefinition macro) throws CModelException{
|
||||||
// create element
|
// create element
|
||||||
final IASTName name= macro.getName();
|
final IASTName name= macro.getName();
|
||||||
|
@ -425,7 +389,6 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
||||||
setIdentifierPosition(element, name);
|
setIdentifierPosition(element, name);
|
||||||
setBodyPosition(element, macro);
|
setBodyPosition(element, macro);
|
||||||
return element;
|
return element;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createDeclaration(Parent parent, IASTDeclaration declaration) throws CModelException, DOMException {
|
private void createDeclaration(Parent parent, IASTDeclaration declaration) throws CModelException, DOMException {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2000, 2006 QNX Software Systems and others.
|
* Copyright (c) 2000, 2007 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
|
||||||
|
@ -7,6 +7,7 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.model;
|
package org.eclipse.cdt.internal.core.model;
|
||||||
|
@ -18,7 +19,9 @@ public class Include extends SourceManipulation implements IInclude {
|
||||||
|
|
||||||
private final boolean standard;
|
private final boolean standard;
|
||||||
private String fullPath;
|
private String fullPath;
|
||||||
|
private boolean fIsActive= true;
|
||||||
|
private boolean fIsResolved= true;
|
||||||
|
|
||||||
public Include(ICElement parent, String name, boolean isStandard) {
|
public Include(ICElement parent, String name, boolean isStandard) {
|
||||||
super(parent, name, ICElement.C_INCLUDE);
|
super(parent, name, ICElement.C_INCLUDE);
|
||||||
standard = isStandard;
|
standard = isStandard;
|
||||||
|
@ -54,4 +57,41 @@ public class Include extends SourceManipulation implements IInclude {
|
||||||
this.fullPath = fullPath;
|
this.fullPath = fullPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setActive(boolean active) {
|
||||||
|
fIsActive= active;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.core.model.IInclude#isActive()
|
||||||
|
*/
|
||||||
|
public boolean isActive() {
|
||||||
|
return fIsActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResolved(boolean resolved) {
|
||||||
|
fIsResolved= resolved;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.core.model.IInclude#isResolved()
|
||||||
|
*/
|
||||||
|
public boolean isResolved() {
|
||||||
|
return fIsResolved;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.internal.core.model.CElement#equals(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if (other instanceof IInclude) {
|
||||||
|
return equals(this, (IInclude) other);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean equals(IInclude lhs, IInclude rhs) {
|
||||||
|
return CElement.equals(lhs, rhs) &&
|
||||||
|
lhs.isActive() == rhs.isActive() &&
|
||||||
|
lhs.isLocal() == rhs.isLocal();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ public interface IASTPreprocessorIncludeStatement extends
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the absolute location of the file found through #include.
|
* Returns the absolute location of the file found through #include.
|
||||||
|
* Only valid if {@link #isResolved()} returns <code>true</code>.
|
||||||
*/
|
*/
|
||||||
public String getPath();
|
public String getPath();
|
||||||
|
|
||||||
|
@ -44,4 +45,16 @@ public interface IASTPreprocessorIncludeStatement extends
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public boolean isSystemInclude();
|
public boolean isSystemInclude();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this include directive was actually taken.
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public boolean isActive();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this include file was successfully resolved.
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public boolean isResolved();
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,8 +46,13 @@ public interface IIndexInclude {
|
||||||
IIndexFileLocation getIncludedByLocation() throws CoreException;
|
IIndexFileLocation getIncludedByLocation() throws CoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the IIndexFileLocation of the file that is included by this directive.
|
* Returns the IIndexFileLocation of the file that is included by this
|
||||||
* @return the IIndexFileLocation of the file that is included by this directive
|
* directive. In case of an unresolved or inactive include <code>null</code>
|
||||||
|
* will be returned.
|
||||||
|
*
|
||||||
|
* @return the IIndexFileLocation of the file that is included by this
|
||||||
|
* directive or <code>null</code> if the include is unresolved or
|
||||||
|
* inactive
|
||||||
* @throws CoreException
|
* @throws CoreException
|
||||||
*/
|
*/
|
||||||
IIndexFileLocation getIncludesLocation() throws CoreException;
|
IIndexFileLocation getIncludesLocation() throws CoreException;
|
||||||
|
@ -72,4 +77,20 @@ public interface IIndexInclude {
|
||||||
* @throws CoreException
|
* @throws CoreException
|
||||||
*/
|
*/
|
||||||
boolean isSystemInclude() throws CoreException;
|
boolean isSystemInclude() throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether this include is in active code (not skipped by conditional preprocessing).
|
||||||
|
*
|
||||||
|
* @return whether this include is in active code
|
||||||
|
* @throws CoreException
|
||||||
|
*/
|
||||||
|
boolean isActive() throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether this include has been resolved (found in the file system).
|
||||||
|
*
|
||||||
|
* @return whether this is a resolved include
|
||||||
|
* @throws CoreException
|
||||||
|
*/
|
||||||
|
boolean isResolved() throws CoreException;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
* Markus Schorn - initial API and implementation
|
* Markus Schorn - initial API and implementation
|
||||||
* Bryan Wilkinson (QNX)
|
* Bryan Wilkinson (QNX)
|
||||||
* Andrew Ferguson (Symbian)
|
* Andrew Ferguson (Symbian)
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.index;
|
package org.eclipse.cdt.internal.core.index;
|
||||||
|
@ -151,6 +152,9 @@ public class CIndex implements IIndex {
|
||||||
}
|
}
|
||||||
|
|
||||||
public IIndexFile resolveInclude(IIndexInclude include) throws CoreException {
|
public IIndexFile resolveInclude(IIndexInclude include) throws CoreException {
|
||||||
|
if (!include.isResolved()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
IIndexFragmentInclude fragmentInclude = (IIndexFragmentInclude) include;
|
IIndexFragmentInclude fragmentInclude = (IIndexFragmentInclude) include;
|
||||||
IIndexFragment frag= fragmentInclude.getFragment();
|
IIndexFragment frag= fragmentInclude.getFragment();
|
||||||
if (isPrimaryFragment(frag)) {
|
if (isPrimaryFragment(frag)) {
|
||||||
|
@ -380,7 +384,7 @@ public class CIndex implements IIndex {
|
||||||
List result = new ArrayList();
|
List result = new ArrayList();
|
||||||
for (int i = 0; i < fFragments.length; i++) {
|
for (int i = 0; i < fFragments.length; i++) {
|
||||||
IIndexFragmentBinding adapted = fFragments[i].adaptBinding(binding);
|
IIndexFragmentBinding adapted = fFragments[i].adaptBinding(binding);
|
||||||
if (adapted instanceof IIndexFragmentBinding) {
|
if (adapted != null) {
|
||||||
result.add(adapted);
|
result.add(adapted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2005, 2006 QNX Software Systems and others.
|
* Copyright (c) 2005, 2007 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
|
||||||
|
@ -9,6 +9,7 @@
|
||||||
* QNX - Initial API and implementation
|
* QNX - Initial API and implementation
|
||||||
* Markus Schorn (Wind River Systems)
|
* Markus Schorn (Wind River Systems)
|
||||||
* Andrew Ferguson (Symbian)
|
* Andrew Ferguson (Symbian)
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.index;
|
package org.eclipse.cdt.internal.core.index;
|
||||||
|
|
||||||
|
@ -16,10 +17,12 @@ import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
|
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
|
||||||
|
@ -49,6 +52,7 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
||||||
private Map/*<IIndexFileLocation,FileInfo>*/ fileInfoCache;
|
private Map/*<IIndexFileLocation,FileInfo>*/ fileInfoCache;
|
||||||
private Map/*<String,IIndexFileLocation>*/ iflCache;
|
private Map/*<String,IIndexFileLocation>*/ iflCache;
|
||||||
private List usedMacros = new ArrayList();
|
private List usedMacros = new ArrayList();
|
||||||
|
private Set/*<FileInfo>*/ fIncluded= new HashSet();
|
||||||
/** The fallback code reader factory used in case a header file is not indexed */
|
/** The fallback code reader factory used in case a header file is not indexed */
|
||||||
private ICodeReaderFactory fFallBackFactory;
|
private ICodeReaderFactory fFallBackFactory;
|
||||||
|
|
||||||
|
@ -118,6 +122,10 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
||||||
IIndexFileLocation incLocation = findLocation(canonicalPath);
|
IIndexFileLocation incLocation = findLocation(canonicalPath);
|
||||||
FileInfo info= createInfo(incLocation, null);
|
FileInfo info= createInfo(incLocation, null);
|
||||||
|
|
||||||
|
if (isIncluded(info)) {
|
||||||
|
return new CodeReader(canonicalPath, EMPTY_CHARS);
|
||||||
|
}
|
||||||
|
|
||||||
// try to build macro dictionary off index
|
// try to build macro dictionary off index
|
||||||
if (info.fFile != null) {
|
if (info.fFile != null) {
|
||||||
try {
|
try {
|
||||||
|
@ -145,6 +153,7 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
||||||
} catch (NeedToParseException e) {
|
} catch (NeedToParseException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
setIncluded(info);
|
||||||
}
|
}
|
||||||
catch (CoreException e) {
|
catch (CoreException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
|
@ -157,6 +166,23 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
||||||
return ParserUtil.createReader(canonicalPath, null);
|
return ParserUtil.createReader(canonicalPath, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark the given inclusion as included.
|
||||||
|
* @param info
|
||||||
|
*/
|
||||||
|
private void setIncluded(FileInfo info) {
|
||||||
|
fIncluded.add(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether the given inclusion is already included.
|
||||||
|
* @param info
|
||||||
|
* @return <code>true</code> if the inclusion is already included.
|
||||||
|
*/
|
||||||
|
private boolean isIncluded(FileInfo info) {
|
||||||
|
return fIncluded.contains(info);
|
||||||
|
}
|
||||||
|
|
||||||
private FileInfo createInfo(IIndexFileLocation location, IIndexFile file) throws CoreException {
|
private FileInfo createInfo(IIndexFileLocation location, IIndexFile file) throws CoreException {
|
||||||
FileInfo info= (FileInfo) fileInfoCache.get(location);
|
FileInfo info= (FileInfo) fileInfoCache.get(location);
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
|
@ -171,10 +197,13 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
||||||
if (!target.add(fileInfo)) {
|
if (!target.add(fileInfo)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (isIncluded(fileInfo)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (fileInfo.fFile == null || fileInfo.isRequested()) {
|
if (fileInfo.fFile == null || fileInfo.isRequested()) {
|
||||||
throw new NeedToParseException();
|
throw new NeedToParseException();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Follow the includes
|
// Follow the includes
|
||||||
IIndexFile file= fileInfo.fFile;
|
IIndexFile file= fileInfo.fFile;
|
||||||
IIndexInclude[] includeDirectives= file.getIncludes();
|
IIndexInclude[] includeDirectives= file.getIncludes();
|
||||||
|
@ -185,6 +214,7 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
||||||
getInfosForMacroDictionary(nextInfo, target);
|
getInfosForMacroDictionary(nextInfo, target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
setIncluded(fileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearMacroAttachements() {
|
public void clearMacroAttachements() {
|
||||||
|
@ -198,6 +228,7 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
usedMacros.clear();
|
usedMacros.clear();
|
||||||
|
fIncluded.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICodeReaderCache getCodeReaderCache() {
|
public ICodeReaderCache getCodeReaderCache() {
|
||||||
|
|
|
@ -2636,10 +2636,10 @@ abstract class BaseScanner implements IScanner {
|
||||||
if (type != ppKeywords.undefined) {
|
if (type != ppKeywords.undefined) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ppInclude:
|
case ppInclude:
|
||||||
handlePPInclude(pos, false, startingLineNumber);
|
handlePPInclude(pos, false, startingLineNumber, true);
|
||||||
return;
|
return;
|
||||||
case ppInclude_next:
|
case ppInclude_next:
|
||||||
handlePPInclude(pos, true, startingLineNumber);
|
handlePPInclude(pos, true, startingLineNumber, true);
|
||||||
return;
|
return;
|
||||||
case ppDefine:
|
case ppDefine:
|
||||||
handlePPDefine(pos, startingLineNumber);
|
handlePPDefine(pos, startingLineNumber);
|
||||||
|
@ -2760,7 +2760,7 @@ abstract class BaseScanner implements IScanner {
|
||||||
protected abstract void processIf(int startPos, int endPos, boolean taken);
|
protected abstract void processIf(int startPos, int endPos, boolean taken);
|
||||||
|
|
||||||
protected void handlePPInclude(int pos2, boolean include_next,
|
protected void handlePPInclude(int pos2, boolean include_next,
|
||||||
int startingLineNumber) {
|
int startingLineNumber, boolean active) {
|
||||||
char[] buffer = bufferStack[bufferStackPos];
|
char[] buffer = bufferStack[bufferStackPos];
|
||||||
int limit = bufferLimit[bufferStackPos];
|
int limit = bufferLimit[bufferStackPos];
|
||||||
|
|
||||||
|
@ -2845,6 +2845,7 @@ abstract class BaseScanner implements IScanner {
|
||||||
nameOffset= pos;
|
nameOffset= pos;
|
||||||
int len= bufferPos[bufferStackPos] - nameOffset;
|
int len= bufferPos[bufferStackPos] - nameOffset;
|
||||||
nameEndOffset= nameOffset + len;
|
nameEndOffset= nameOffset + len;
|
||||||
|
endOffset= nameEndOffset;
|
||||||
bufferPos[bufferStackPos]--;
|
bufferPos[bufferStackPos]--;
|
||||||
|
|
||||||
Object expObject = definitions.get(buffer, nameOffset, len);
|
Object expObject = definitions.get(buffer, nameOffset, len);
|
||||||
|
@ -2874,19 +2875,46 @@ abstract class BaseScanner implements IScanner {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filename == null || filename == EMPTY_STRING) {
|
if (filename == null || filename == EMPTY_STRING) {
|
||||||
handleProblem(IProblem.PREPROCESSOR_INVALID_DIRECTIVE, startOffset,
|
if (active) {
|
||||||
null);
|
handleProblem(IProblem.PREPROCESSOR_INVALID_DIRECTIVE, startOffset,
|
||||||
return;
|
null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
filename= new String(buffer, nameOffset, nameEndOffset - nameOffset);
|
||||||
}
|
}
|
||||||
char[] fileNameArray = filename.toCharArray();
|
char[] fileNameArray = filename.toCharArray();
|
||||||
|
|
||||||
// TODO else we need to do macro processing on the rest of the line
|
// TODO else we need to do macro processing on the rest of the line
|
||||||
endLine = getLineNumber(bufferPos[bufferStackPos]);
|
endLine = getLineNumber(bufferPos[bufferStackPos]);
|
||||||
skipToNewLine();
|
skipToNewLine();
|
||||||
|
|
||||||
findAndPushInclusion(filename, fileNameArray, local, include_next, startOffset, nameOffset, nameEndOffset, endOffset, startingLineNumber, nameLine, endLine);
|
if (active) {
|
||||||
|
findAndPushInclusion(filename, fileNameArray, local, include_next, startOffset, nameOffset, nameEndOffset, endOffset, startingLineNumber, nameLine, endLine);
|
||||||
|
} else {
|
||||||
|
processInclude(fileNameArray, local, active, startOffset, nameOffset, nameEndOffset, endOffset, startingLineNumber, nameLine, endLine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Process an include directive without following the inclusion.
|
||||||
|
*
|
||||||
|
* @param fileName
|
||||||
|
* @param local
|
||||||
|
* @param active
|
||||||
|
* @param startOffset
|
||||||
|
* @param nameOffset
|
||||||
|
* @param nameEndOffset
|
||||||
|
* @param endOffset
|
||||||
|
* @param startingLineNumber
|
||||||
|
* @param nameLine
|
||||||
|
* @param endLine
|
||||||
|
*/
|
||||||
|
protected void processInclude(char[] fileName, boolean local, boolean active, int startOffset, int nameOffset,
|
||||||
|
int nameEndOffset, int endOffset, int startingLineNumber, int nameLine, int endLine) {
|
||||||
|
// default: do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* @param filename
|
* @param filename
|
||||||
* @param fileNameArray
|
* @param fileNameArray
|
||||||
* @param local
|
* @param local
|
||||||
|
@ -2922,6 +2950,7 @@ abstract class BaseScanner implements IScanner {
|
||||||
endLine, false)));
|
endLine, false)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
processInclude(fileNameArray, local, true, startOffset, nameOffset, nameEndOffset, endOffset, startingLine, nameLine, endLine);
|
||||||
handleProblem(IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, startOffset,
|
handleProblem(IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, startOffset,
|
||||||
fileNameArray);
|
fileNameArray);
|
||||||
return;
|
return;
|
||||||
|
@ -2981,6 +3010,7 @@ abstract class BaseScanner implements IScanner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
processInclude(fileNameArray, local, true, startOffset, nameOffset, nameEndOffset, endOffset, startingLine, nameLine, endLine);
|
||||||
handleProblem(IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, startOffset,
|
handleProblem(IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, startOffset,
|
||||||
fileNameArray);
|
fileNameArray);
|
||||||
}
|
}
|
||||||
|
@ -3552,6 +3582,12 @@ abstract class BaseScanner implements IScanner {
|
||||||
skipToNewLine();
|
skipToNewLine();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ppInclude:
|
||||||
|
handlePPInclude(startPos, false, getLineNumber(startPos), false);
|
||||||
|
break;
|
||||||
|
case ppInclude_next:
|
||||||
|
handlePPInclude(startPos, true, getLineNumber(startPos), false);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,6 +171,14 @@ public class DOMScanner extends BaseScanner {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.internal.core.parser.scanner2.BaseScanner#processInclude(char[], boolean, boolean, int, int, int, int, int, int, int)
|
||||||
|
*/
|
||||||
|
protected void processInclude(char[] filename, boolean local, boolean active, int startOffset, int nameOffset,
|
||||||
|
int nameEndOffset, int endOffset, int startingLineNumber, int nameLine, int endLine) {
|
||||||
|
locationMap.encounterPoundInclude(getGlobalOffset(startOffset), getGlobalOffset(nameOffset), getGlobalOffset(nameEndOffset), getGlobalOffset(endOffset), filename, !local, active);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
|
|
|
@ -74,7 +74,9 @@ public interface IScannerPreprocessorLog {
|
||||||
public void encounterPoundUndef(int startOffset, int endOffset,
|
public void encounterPoundUndef(int startOffset, int endOffset,
|
||||||
char[] symbol, int nameOffset, IMacroDefinition macroDefinition);
|
char[] symbol, int nameOffset, IMacroDefinition macroDefinition);
|
||||||
|
|
||||||
public void encounterProblem(IASTProblem problem);
|
public void encounterPoundInclude(int startOffset, int nameOffset, int nameEndOffset, int endOffset, char[] name, boolean systemInclude, boolean active);
|
||||||
|
|
||||||
|
public void encounterProblem(IASTProblem problem);
|
||||||
|
|
||||||
public IMacroDefinition registerBuiltinObjectStyleMacro(ObjectStyleMacro macro);
|
public IMacroDefinition registerBuiltinObjectStyleMacro(ObjectStyleMacro macro);
|
||||||
|
|
||||||
|
@ -83,5 +85,5 @@ public interface IScannerPreprocessorLog {
|
||||||
public IMacroDefinition registerBuiltinDynamicFunctionStyleMacro(DynamicFunctionStyleMacro macro);
|
public IMacroDefinition registerBuiltinDynamicFunctionStyleMacro(DynamicFunctionStyleMacro macro);
|
||||||
|
|
||||||
public IMacroDefinition registerBuiltinDynamicStyleMacro(DynamicStyleMacro macro);
|
public IMacroDefinition registerBuiltinDynamicStyleMacro(DynamicStyleMacro macro);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -442,6 +442,33 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an include directive without sub-contexts.
|
||||||
|
* This allows to model inactive includes and unresolved includes.
|
||||||
|
*/
|
||||||
|
protected static class _Include extends _Context implements
|
||||||
|
_IPreprocessorIncludeDirective {
|
||||||
|
|
||||||
|
public final int fNameOffset;
|
||||||
|
public final int fNameEndOffset;
|
||||||
|
public final char[] fName;
|
||||||
|
public final boolean fSystemInclude;
|
||||||
|
public final boolean fIsActive;
|
||||||
|
public final boolean fIsResolved;
|
||||||
|
|
||||||
|
public _Include(_CompositeContext parent, int startOffset, int endOffset, int nameOffset, int nameEndoffset,
|
||||||
|
char[] name, boolean systemInclude, boolean active, boolean resolved) {
|
||||||
|
super(parent, startOffset, endOffset);
|
||||||
|
fNameOffset= nameOffset;
|
||||||
|
fNameEndOffset= nameEndoffset;
|
||||||
|
fName= name;
|
||||||
|
fSystemInclude= systemInclude;
|
||||||
|
fIsActive= active;
|
||||||
|
fIsResolved= resolved;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author jcamelon
|
* @author jcamelon
|
||||||
*/
|
*/
|
||||||
|
@ -454,7 +481,8 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
public int startOffset;
|
public int startOffset;
|
||||||
public int endOffset;
|
public int endOffset;
|
||||||
private boolean fSystemInclude;
|
private boolean fSystemInclude;
|
||||||
|
private boolean fIsActive= true;
|
||||||
|
private boolean fIsResolved= true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param cs
|
* @param cs
|
||||||
|
@ -463,11 +491,6 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
this.path = cs;
|
this.path = cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement#getPath()
|
|
||||||
*/
|
|
||||||
public String getPath() {
|
public String getPath() {
|
||||||
return new String(path);
|
return new String(path);
|
||||||
}
|
}
|
||||||
|
@ -491,6 +514,22 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
public void setSystemInclude(boolean val) {
|
public void setSystemInclude(boolean val) {
|
||||||
fSystemInclude= val;
|
fSystemInclude= val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isActive() {
|
||||||
|
return fIsActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setActive(boolean val) {
|
||||||
|
fIsActive= val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isResolved() {
|
||||||
|
return fIsResolved;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResolved(boolean val) {
|
||||||
|
fIsResolved= val;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -605,6 +644,8 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
|
|
||||||
public static interface _IPreprocessorDirective {
|
public static interface _IPreprocessorDirective {
|
||||||
}
|
}
|
||||||
|
public static interface _IPreprocessorIncludeDirective extends _IPreprocessorDirective {
|
||||||
|
}
|
||||||
|
|
||||||
protected class _Undef extends _Context implements
|
protected class _Undef extends _Context implements
|
||||||
_IPreprocessorDirective {
|
_IPreprocessorDirective {
|
||||||
|
@ -1216,7 +1257,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static class _Inclusion extends _CompositeFileContext implements
|
protected static class _Inclusion extends _CompositeFileContext implements
|
||||||
_IPreprocessorDirective {
|
_IPreprocessorIncludeDirective {
|
||||||
|
|
||||||
public final int fNameOffset;
|
public final int fNameOffset;
|
||||||
public final int fNameEndOffset;
|
public final int fNameEndOffset;
|
||||||
|
@ -1539,7 +1580,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
collectContexts(V_INCLUSIONS, tu, contexts, 0);
|
collectContexts(V_INCLUSIONS, tu, contexts, 0);
|
||||||
IASTPreprocessorIncludeStatement[] result = new IASTPreprocessorIncludeStatement[size];
|
IASTPreprocessorIncludeStatement[] result = new IASTPreprocessorIncludeStatement[size];
|
||||||
for (int i = 0; i < size; ++i)
|
for (int i = 0; i < size; ++i)
|
||||||
result[i] = createASTInclusion(((_Inclusion) contexts[i]));
|
result[i] = (IASTPreprocessorIncludeStatement)createPreprocessorStatement(contexts[i]);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1561,6 +1602,26 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
result.setParent(rootNode);
|
result.setParent(rootNode);
|
||||||
result.setPropertyInParent(IASTTranslationUnit.PREPROCESSOR_STATEMENT);
|
result.setPropertyInParent(IASTTranslationUnit.PREPROCESSOR_STATEMENT);
|
||||||
result.setSystemInclude(inc.fSystemInclude);
|
result.setSystemInclude(inc.fSystemInclude);
|
||||||
|
result.setActive(true);
|
||||||
|
result.setResolved(true);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IASTPreprocessorIncludeStatement createASTInclusion(_Include inc) {
|
||||||
|
ASTInclusionStatement result = new ASTInclusionStatement(inc.fName);
|
||||||
|
result.setOffsetAndLength(inc.context_directive_start, inc.getDirectiveLength());
|
||||||
|
result.startOffset = inc.getContextStart();
|
||||||
|
result.endOffset = inc.context_directive_end;
|
||||||
|
ASTIncludeName name= new ASTIncludeName(inc.fName);
|
||||||
|
name.setPropertyInParent(IASTPreprocessorIncludeStatement.INCLUDE_NAME);
|
||||||
|
name.setParent(result);
|
||||||
|
name.setOffsetAndLength(inc.fNameOffset, inc.fNameEndOffset-inc.fNameOffset);
|
||||||
|
result.setName(name);
|
||||||
|
result.setParent(rootNode);
|
||||||
|
result.setPropertyInParent(IASTTranslationUnit.PREPROCESSOR_STATEMENT);
|
||||||
|
result.setSystemInclude(inc.fSystemInclude);
|
||||||
|
result.setActive(inc.fIsActive);
|
||||||
|
result.setResolved(inc.fIsResolved);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1587,6 +1648,8 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
IASTPreprocessorStatement result = null;
|
IASTPreprocessorStatement result = null;
|
||||||
if (context instanceof _Inclusion)
|
if (context instanceof _Inclusion)
|
||||||
result = createASTInclusion(((_Inclusion) context));
|
result = createASTInclusion(((_Inclusion) context));
|
||||||
|
else if (context instanceof _Include)
|
||||||
|
result = createASTInclusion(((_Include) context));
|
||||||
else if (context instanceof _MacroDefinition)
|
else if (context instanceof _MacroDefinition)
|
||||||
result = createASTMacroDefinition((_MacroDefinition) context);
|
result = createASTMacroDefinition((_MacroDefinition) context);
|
||||||
else if (context instanceof _Undef)
|
else if (context instanceof _Undef)
|
||||||
|
@ -2171,6 +2234,14 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
endOffset));
|
endOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#encounterPoundInclude(int, int, int, int, char[], boolean, boolean)
|
||||||
|
*/
|
||||||
|
public void encounterPoundInclude(int startOffset, int nameOffset, int nameEndOffset, int endOffset, char[] name,
|
||||||
|
boolean systemInclude, boolean active) {
|
||||||
|
currentContext.addSubContext(new _Include(currentContext, startOffset, endOffset, nameOffset, nameEndOffset, name, systemInclude, active, false));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
*
|
*
|
||||||
|
@ -2256,7 +2327,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
++count;
|
++count;
|
||||||
break;
|
break;
|
||||||
case V_INCLUSIONS:
|
case V_INCLUSIONS:
|
||||||
if (source instanceof _Inclusion) {
|
if (source instanceof _IPreprocessorIncludeDirective) {
|
||||||
if (result != null)
|
if (result != null)
|
||||||
result[startAt++] = source;
|
result[startAt++] = source;
|
||||||
++count;
|
++count;
|
||||||
|
@ -2264,7 +2335,6 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
||||||
break;
|
break;
|
||||||
case V_PROBLEMS:
|
case V_PROBLEMS:
|
||||||
if (source instanceof _Problem) {
|
if (source instanceof _Problem) {
|
||||||
|
|
||||||
if (result != null)
|
if (result != null)
|
||||||
result[startAt++] = source;
|
result[startAt++] = source;
|
||||||
++count;
|
++count;
|
||||||
|
|
|
@ -42,6 +42,8 @@ public class PDOMInclude implements IIndexFragmentInclude {
|
||||||
private static final int FLAG_OFFSET = 26;
|
private static final int FLAG_OFFSET = 26;
|
||||||
|
|
||||||
private static final int FLAG_SYSTEM_INCLUDE = 1;
|
private static final int FLAG_SYSTEM_INCLUDE = 1;
|
||||||
|
private static final int FLAG_INACTIVE_INCLUDE = 2;
|
||||||
|
private static final int FLAG_UNRESOLVED_INCLUDE = 4;
|
||||||
|
|
||||||
private final int RECORD_SIZE = 27;
|
private final int RECORD_SIZE = 27;
|
||||||
|
|
||||||
|
@ -67,6 +69,12 @@ public class PDOMInclude implements IIndexFragmentInclude {
|
||||||
if (include.isSystemInclude()) {
|
if (include.isSystemInclude()) {
|
||||||
flags |= FLAG_SYSTEM_INCLUDE;
|
flags |= FLAG_SYSTEM_INCLUDE;
|
||||||
}
|
}
|
||||||
|
if (!include.isActive()) {
|
||||||
|
flags |= FLAG_INACTIVE_INCLUDE;
|
||||||
|
}
|
||||||
|
if (!include.isResolved()) {
|
||||||
|
flags |= FLAG_UNRESOLVED_INCLUDE;
|
||||||
|
}
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,6 +177,14 @@ public class PDOMInclude implements IIndexFragmentInclude {
|
||||||
return (getFlag() & FLAG_SYSTEM_INCLUDE) != 0;
|
return (getFlag() & FLAG_SYSTEM_INCLUDE) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isActive() throws CoreException {
|
||||||
|
return (getFlag() & FLAG_INACTIVE_INCLUDE) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isResolved() throws CoreException {
|
||||||
|
return (getFlag() & FLAG_UNRESOLVED_INCLUDE) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
public int getNameOffset() throws CoreException {
|
public int getNameOffset() throws CoreException {
|
||||||
return pdom.getDB().getInt(record + NODE_OFFSET_OFFSET);
|
return pdom.getDB().getInt(record + NODE_OFFSET_OFFSET);
|
||||||
}
|
}
|
||||||
|
|
BIN
core/org.eclipse.cdt.ui/icons/ovr16/inactive_co.gif
Normal file
BIN
core/org.eclipse.cdt.ui/icons/ovr16/inactive_co.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 78 B |
|
@ -145,7 +145,7 @@ public class CPluginImages {
|
||||||
public static final ImageDescriptor DESC_OBJS_PROTECTED_FIELD= createManaged(T_OBJ, IMG_OBJS_PROTECTED_FIELD);
|
public static final ImageDescriptor DESC_OBJS_PROTECTED_FIELD= createManaged(T_OBJ, IMG_OBJS_PROTECTED_FIELD);
|
||||||
public static final ImageDescriptor DESC_OBJS_PRIVATE_FIELD= createManaged(T_OBJ, IMG_OBJS_PRIVATE_FIELD);
|
public static final ImageDescriptor DESC_OBJS_PRIVATE_FIELD= createManaged(T_OBJ, IMG_OBJS_PRIVATE_FIELD);
|
||||||
public static final ImageDescriptor DESC_OBJS_KEYWORD= createManaged(T_OBJ, IMG_OBJS_KEYWORD);
|
public static final ImageDescriptor DESC_OBJS_KEYWORD= createManaged(T_OBJ, IMG_OBJS_KEYWORD);
|
||||||
|
|
||||||
public static final ImageDescriptor DESC_OBJS_CLASS_ALT= createManaged(T_OBJ, IMG_OBJS_CLASS_ALT);
|
public static final ImageDescriptor DESC_OBJS_CLASS_ALT= createManaged(T_OBJ, IMG_OBJS_CLASS_ALT);
|
||||||
public static final ImageDescriptor DESC_OBJS_STRUCT_ALT= createManaged(T_OBJ, IMG_OBJS_STRUCT_ALT);
|
public static final ImageDescriptor DESC_OBJS_STRUCT_ALT= createManaged(T_OBJ, IMG_OBJS_STRUCT_ALT);
|
||||||
public static final ImageDescriptor DESC_OBJS_UNION_ALT= createManaged(T_OBJ, IMG_OBJS_UNION_ALT);
|
public static final ImageDescriptor DESC_OBJS_UNION_ALT= createManaged(T_OBJ, IMG_OBJS_UNION_ALT);
|
||||||
|
@ -251,6 +251,7 @@ public class CPluginImages {
|
||||||
public static final ImageDescriptor DESC_OVR_REC_REFERENCEDBY= create(T_OVR, "rec_referencedby_co.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_OVR_REC_REFERENCEDBY= create(T_OVR, "rec_referencedby_co.gif"); //$NON-NLS-1$
|
||||||
public static final ImageDescriptor DESC_OVR_SYSTEM_INCLUDE= create(T_OVR, "systeminclude_co.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_OVR_SYSTEM_INCLUDE= create(T_OVR, "systeminclude_co.gif"); //$NON-NLS-1$
|
||||||
public static final ImageDescriptor DESC_OVR_DEFINES= create(T_OVR, "defines_co.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_OVR_DEFINES= create(T_OVR, "defines_co.gif"); //$NON-NLS-1$
|
||||||
|
public static final ImageDescriptor DESC_OVR_INACTIVE= create(T_OVR, "inactive_co.gif"); //$NON-NLS-1$
|
||||||
|
|
||||||
public static final ImageDescriptor DESC_OVR_WARNING= create(T_OVR, "warning_co.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_OVR_WARNING= create(T_OVR, "warning_co.gif"); //$NON-NLS-1$
|
||||||
public static final ImageDescriptor DESC_OVR_ERROR= create(T_OVR, "error_co.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_OVR_ERROR= create(T_OVR, "error_co.gif"); //$NON-NLS-1$
|
||||||
|
|
|
@ -122,7 +122,7 @@ public class IBContentProvider extends AsyncTreeContentProvider {
|
||||||
name, include.getNameOffset(),
|
name, include.getNameOffset(),
|
||||||
include.getNameLength(),
|
include.getNameLength(),
|
||||||
include.getIncludedBy().getTimestamp());
|
include.getIncludedBy().getTimestamp());
|
||||||
newnode.setIsActiveCode(true);
|
newnode.setIsActiveCode(include.isActive());
|
||||||
newnode.setIsSystemInclude(include.isSystemInclude());
|
newnode.setIsSystemInclude(include.isSystemInclude());
|
||||||
result.add(newnode);
|
result.add(newnode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,6 +81,9 @@ public class IBLabelProvider extends LabelProvider implements IColorProvider {
|
||||||
if (node.isSystemInclude()) {
|
if (node.isSystemInclude()) {
|
||||||
flags |= CElementImageDescriptor.SYSTEM_INCLUDE;
|
flags |= CElementImageDescriptor.SYSTEM_INCLUDE;
|
||||||
}
|
}
|
||||||
|
if (!node.isActiveCode()) {
|
||||||
|
flags |= CElementImageDescriptor.INACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
if (node.isRecursive()) {
|
if (node.isRecursive()) {
|
||||||
flags |= CElementImageDescriptor.RECURSIVE_RELATION;
|
flags |= CElementImageDescriptor.RECURSIVE_RELATION;
|
||||||
|
@ -94,7 +97,7 @@ public class IBLabelProvider extends LabelProvider implements IColorProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.getRepresentedTranslationUnit() == null) {
|
if (node.isActiveCode() && node.getRepresentedTranslationUnit() == null) {
|
||||||
flags |= CElementImageDescriptor.WARNING;
|
flags |= CElementImageDescriptor.WARNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,25 +12,6 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.viewsupport;
|
package org.eclipse.cdt.internal.ui.viewsupport;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
|
||||||
import org.eclipse.cdt.core.model.IBinary;
|
|
||||||
import org.eclipse.cdt.core.model.IBinaryModule;
|
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
|
||||||
import org.eclipse.cdt.core.model.IContributedCElement;
|
|
||||||
import org.eclipse.cdt.core.model.IDeclaration;
|
|
||||||
import org.eclipse.cdt.core.model.IField;
|
|
||||||
import org.eclipse.cdt.core.model.IIncludeReference;
|
|
||||||
import org.eclipse.cdt.core.model.ILibraryReference;
|
|
||||||
import org.eclipse.cdt.core.model.IMethodDeclaration;
|
|
||||||
import org.eclipse.cdt.core.model.ISourceRoot;
|
|
||||||
import org.eclipse.cdt.core.model.ITemplate;
|
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
|
||||||
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
|
||||||
import org.eclipse.cdt.internal.ui.CPluginImages;
|
|
||||||
import org.eclipse.cdt.ui.CElementImageDescriptor;
|
|
||||||
import org.eclipse.cdt.ui.CUIPlugin;
|
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.runtime.IAdaptable;
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
|
@ -41,6 +22,28 @@ import org.eclipse.ui.ISharedImages;
|
||||||
import org.eclipse.ui.ide.IDE;
|
import org.eclipse.ui.ide.IDE;
|
||||||
import org.eclipse.ui.model.IWorkbenchAdapter;
|
import org.eclipse.ui.model.IWorkbenchAdapter;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
|
import org.eclipse.cdt.core.model.IBinary;
|
||||||
|
import org.eclipse.cdt.core.model.IBinaryModule;
|
||||||
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IContributedCElement;
|
||||||
|
import org.eclipse.cdt.core.model.IDeclaration;
|
||||||
|
import org.eclipse.cdt.core.model.IField;
|
||||||
|
import org.eclipse.cdt.core.model.IInclude;
|
||||||
|
import org.eclipse.cdt.core.model.IIncludeReference;
|
||||||
|
import org.eclipse.cdt.core.model.ILibraryReference;
|
||||||
|
import org.eclipse.cdt.core.model.IMethodDeclaration;
|
||||||
|
import org.eclipse.cdt.core.model.ISourceRoot;
|
||||||
|
import org.eclipse.cdt.core.model.ITemplate;
|
||||||
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
|
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
||||||
|
import org.eclipse.cdt.ui.CElementImageDescriptor;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default strategy of the C plugin for the construction of C element icons.
|
* Default strategy of the C plugin for the construction of C element icons.
|
||||||
|
@ -48,7 +51,7 @@ import org.eclipse.ui.model.IWorkbenchAdapter;
|
||||||
public class CElementImageProvider {
|
public class CElementImageProvider {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flags for the CImageLabelProvider:
|
* Flags for the CElementImageProvider:
|
||||||
* Generate images with overlays.
|
* Generate images with overlays.
|
||||||
*/
|
*/
|
||||||
public final static int OVERLAY_ICONS= 0x1;
|
public final static int OVERLAY_ICONS= 0x1;
|
||||||
|
@ -103,7 +106,7 @@ public class CElementImageProvider {
|
||||||
* Returns the icon for a given element. The icon depends on the element type
|
* Returns the icon for a given element. The icon depends on the element type
|
||||||
* and element properties. If configured, overlay icons are constructed for
|
* and element properties. If configured, overlay icons are constructed for
|
||||||
* <code>ISourceReference</code>s.
|
* <code>ISourceReference</code>s.
|
||||||
* @param flags Flags as defined by the JavaImageLabelProvider
|
* @param flags Flags as defined by the CElementImageProvider
|
||||||
*/
|
*/
|
||||||
public Image getImageLabel(Object element, int flags) {
|
public Image getImageLabel(Object element, int flags) {
|
||||||
ImageDescriptor descriptor= null;
|
ImageDescriptor descriptor= null;
|
||||||
|
@ -365,7 +368,6 @@ public class CElementImageProvider {
|
||||||
case ICElement.C_TEMPLATE_METHOD:
|
case ICElement.C_TEMPLATE_METHOD:
|
||||||
case ICElement.C_TEMPLATE_METHOD_DECLARATION:
|
case ICElement.C_TEMPLATE_METHOD_DECLARATION:
|
||||||
try {
|
try {
|
||||||
|
|
||||||
IMethodDeclaration md= (IMethodDeclaration)celement;
|
IMethodDeclaration md= (IMethodDeclaration)celement;
|
||||||
ASTAccessVisibility visibility =md.getVisibility();
|
ASTAccessVisibility visibility =md.getVisibility();
|
||||||
return getMethodImageDescriptor(visibility);
|
return getMethodImageDescriptor(visibility);
|
||||||
|
@ -405,8 +407,9 @@ public class CElementImageProvider {
|
||||||
case ICElement.C_USING:
|
case ICElement.C_USING:
|
||||||
return getUsingImageDescriptor();
|
return getUsingImageDescriptor();
|
||||||
|
|
||||||
|
default:
|
||||||
|
return getImageDescriptor(type);
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -415,24 +418,32 @@ public class CElementImageProvider {
|
||||||
private int computeCAdornmentFlags(ICElement element, int renderFlags) {
|
private int computeCAdornmentFlags(ICElement element, int renderFlags) {
|
||||||
|
|
||||||
int flags= computeBasicAdornmentFlags(element, renderFlags);
|
int flags= computeBasicAdornmentFlags(element, renderFlags);
|
||||||
|
if (showOverlayIcons(renderFlags)) {
|
||||||
try {
|
try {
|
||||||
if (showOverlayIcons(renderFlags) && element instanceof IDeclaration) {
|
if (element instanceof IDeclaration) {
|
||||||
IDeclaration decl = (IDeclaration) element;
|
IDeclaration decl = (IDeclaration) element;
|
||||||
if(decl.isStatic()){
|
if(decl.isStatic()){
|
||||||
flags |= CElementImageDescriptor.STATIC;
|
flags |= CElementImageDescriptor.STATIC;
|
||||||
}
|
}
|
||||||
if(decl.isConst()){
|
if(decl.isConst()){
|
||||||
flags |= CElementImageDescriptor.CONSTANT;
|
flags |= CElementImageDescriptor.CONSTANT;
|
||||||
}
|
}
|
||||||
if(decl.isVolatile()){
|
if(decl.isVolatile()){
|
||||||
flags |= CElementImageDescriptor.VOLATILE;
|
flags |= CElementImageDescriptor.VOLATILE;
|
||||||
}
|
}
|
||||||
if(element instanceof ITemplate){
|
if(element instanceof ITemplate){
|
||||||
flags |= CElementImageDescriptor.TEMPLATE;
|
flags |= CElementImageDescriptor.TEMPLATE;
|
||||||
|
}
|
||||||
|
} else if (element instanceof IInclude) {
|
||||||
|
IInclude include= (IInclude) element;
|
||||||
|
if (!include.isActive()) {
|
||||||
|
flags |= CElementImageDescriptor.INACTIVE;
|
||||||
|
} else if (!include.isResolved()) {
|
||||||
|
flags |= CElementImageDescriptor.WARNING;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
}
|
}
|
||||||
} catch (CModelException e) {
|
|
||||||
}
|
}
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
@ -444,7 +455,7 @@ public class CElementImageProvider {
|
||||||
}
|
}
|
||||||
if ((renderFlags & OVERLAY_WARNING) !=0) {
|
if ((renderFlags & OVERLAY_WARNING) !=0) {
|
||||||
flags |= CElementImageDescriptor.WARNING;
|
flags |= CElementImageDescriptor.WARNING;
|
||||||
}
|
}
|
||||||
// if ((renderFlags & OVERLAY_OVERRIDE) !=0) {
|
// if ((renderFlags & OVERLAY_OVERRIDE) !=0) {
|
||||||
// flags |= CElementImageDescriptor.OVERRIDES;
|
// flags |= CElementImageDescriptor.OVERRIDES;
|
||||||
// }
|
// }
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2000, 2006 IBM Corporation and others.
|
* Copyright (c) 2000, 2007 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
|
||||||
|
@ -7,6 +7,7 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* IBM Corporation - initial API and implementation
|
* IBM Corporation - initial API and implementation
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.viewsupport;
|
package org.eclipse.cdt.internal.ui.viewsupport;
|
||||||
|
|
||||||
|
@ -17,9 +18,13 @@ import org.eclipse.jface.viewers.IColorProvider;
|
||||||
import org.eclipse.jface.viewers.ILabelDecorator;
|
import org.eclipse.jface.viewers.ILabelDecorator;
|
||||||
import org.eclipse.jface.viewers.ILabelProviderListener;
|
import org.eclipse.jface.viewers.ILabelProviderListener;
|
||||||
import org.eclipse.jface.viewers.LabelProvider;
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.graphics.Color;
|
import org.eclipse.swt.graphics.Color;
|
||||||
import org.eclipse.swt.graphics.Image;
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.IInclude;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
|
||||||
public class CUILabelProvider extends LabelProvider implements IColorProvider {
|
public class CUILabelProvider extends LabelProvider implements IColorProvider {
|
||||||
|
|
||||||
protected CElementImageProvider fImageLabelProvider;
|
protected CElementImageProvider fImageLabelProvider;
|
||||||
|
@ -29,6 +34,7 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider {
|
||||||
|
|
||||||
private int fImageFlags;
|
private int fImageFlags;
|
||||||
private int fTextFlags;
|
private int fTextFlags;
|
||||||
|
private Color fInactiveColor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new label provider with default flags.
|
* Creates a new label provider with default flags.
|
||||||
|
@ -38,8 +44,8 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param textFlags Flags defined in <code>JavaElementLabels</code>.
|
* @param textFlags Flags defined in <code>CElementLabels</code>.
|
||||||
* @param imageFlags Flags defined in <code>JavaElementImageProvider</code>.
|
* @param imageFlags Flags defined in <code>CElementImageProvider</code>.
|
||||||
*/
|
*/
|
||||||
public CUILabelProvider(int textFlags, int imageFlags) {
|
public CUILabelProvider(int textFlags, int imageFlags) {
|
||||||
fImageLabelProvider= new CElementImageProvider();
|
fImageLabelProvider= new CElementImageProvider();
|
||||||
|
@ -48,6 +54,7 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider {
|
||||||
fStorageLabelProvider= new StorageLabelProvider();
|
fStorageLabelProvider= new StorageLabelProvider();
|
||||||
fImageFlags= imageFlags;
|
fImageFlags= imageFlags;
|
||||||
fTextFlags= textFlags;
|
fTextFlags= textFlags;
|
||||||
|
fInactiveColor= CUIPlugin.getStandardDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -220,6 +227,12 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider {
|
||||||
* @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
|
* @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
public Color getForeground(Object element) {
|
public Color getForeground(Object element) {
|
||||||
|
if (element instanceof IInclude) {
|
||||||
|
IInclude include= (IInclude)element;
|
||||||
|
if (!include.isActive()) {
|
||||||
|
return fInactiveColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -88,12 +88,15 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
|
||||||
/** Flag to render the 'defines' adornment in the type hierarchy*/
|
/** Flag to render the 'defines' adornment in the type hierarchy*/
|
||||||
public final static int DEFINES= 0x4000;
|
public final static int DEFINES= 0x4000;
|
||||||
|
|
||||||
|
/** Flag to render the 'inactive' adornment for include directives */
|
||||||
|
public final static int INACTIVE= 0x8000;
|
||||||
|
|
||||||
private ImageDescriptor fBaseImage;
|
private ImageDescriptor fBaseImage;
|
||||||
private int fFlags;
|
private int fFlags;
|
||||||
private Point fSize;
|
private Point fSize;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new JavaElementImageDescriptor.
|
* Create a new CElementImageDescriptor.
|
||||||
*
|
*
|
||||||
* @param baseImage an image descriptor used as the base image
|
* @param baseImage an image descriptor used as the base image
|
||||||
* @param flags flags indicating which adornments are to be rendered. See <code>setAdornments</code>
|
* @param flags flags indicating which adornments are to be rendered. See <code>setAdornments</code>
|
||||||
|
@ -255,7 +258,7 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
|
||||||
// x-= data.width;
|
// x-= data.width;
|
||||||
// drawImage(data, x, size.y - data.height);
|
// drawImage(data, x, size.y - data.height);
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawTopLeft() {
|
private void drawTopLeft() {
|
||||||
ImageData data= null;
|
ImageData data= null;
|
||||||
|
@ -263,8 +266,12 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
|
||||||
data= CPluginImages.DESC_OVR_DEFINES.getImageData();
|
data= CPluginImages.DESC_OVR_DEFINES.getImageData();
|
||||||
drawImage(data, 0, 0);
|
drawImage(data, 0, 0);
|
||||||
}
|
}
|
||||||
|
if ((fFlags & INACTIVE) != 0) {
|
||||||
|
data= CPluginImages.DESC_OVR_INACTIVE.getImageData();
|
||||||
|
drawImage(data, 0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawBottomLeft() {
|
private void drawBottomLeft() {
|
||||||
Point size= getSize();
|
Point size= getSize();
|
||||||
int x= 0;
|
int x= 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue