mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 17:05:26 +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
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - Initial API and implementation
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
**********************************************************************/
|
||||
|
||||
package org.eclipse.cdt.managedbuilder.pdomdepgen;
|
||||
|
@ -67,9 +68,11 @@ public class PDOMDependencyCalculator implements IManagedDependencyCalculator {
|
|||
IIndexInclude[] includes = index.findIncludes(file, IIndex.DEPTH_INFINITE);
|
||||
|
||||
List/*<IPath>*/ list = new ArrayList/*<IPath>*/();
|
||||
for (int i = 0; i < includes.length; ++i)
|
||||
list.add(IndexLocationFactory.getAbsolutePath(includes[i].getIncludesLocation()));
|
||||
|
||||
for (int i = 0; i < includes.length; ++i) {
|
||||
if (includes[i].isResolved()) {
|
||||
list.add(IndexLocationFactory.getAbsolutePath(includes[i].getIncludesLocation()));
|
||||
}
|
||||
}
|
||||
dependencies = (IPath[])list.toArray(new IPath[list.size()]);
|
||||
} else
|
||||
dependencies = new IPath[0];
|
||||
|
|
|
@ -465,7 +465,6 @@ public class DOMLocationTests extends AST2BaseTest {
|
|||
public void testBug162180() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append( "#include <notfound.h>\n"); //$NON-NLS-1$
|
||||
int declOffset= buffer.length();
|
||||
buffer.append( "int x;\n"); //$NON-NLS-1$
|
||||
String code = buffer.toString();
|
||||
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();
|
||||
assertEquals( decls.length, 1 );
|
||||
IASTPreprocessorStatement [] statements = tu.getAllPreprocessorStatements();
|
||||
assertEquals( statements.length, 0 );
|
||||
assertEquals( statements.length, 1 );
|
||||
IASTProblem[] problems = tu.getPreprocessorProblems();
|
||||
assertEquals( problems.length, 1 );
|
||||
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 <notfound1.h> \r\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$
|
||||
String code = buffer.toString();
|
||||
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();
|
||||
IASTProblem[] problems = tu.getPreprocessorProblems();
|
||||
assertEquals( 1, decls.length);
|
||||
assertEquals( 0, statements.length);
|
||||
assertEquals( 3, statements.length);
|
||||
assertEquals( 3, problems.length);
|
||||
String snip= "<notfound.h>";
|
||||
assertSoleLocation(problems[0], code, "#include <notfound.h>");
|
||||
assertSoleLocation(problems[1], code, "#include <notfound1.h> ");
|
||||
assertSoleLocation(problems[2], code, "#include <notfound2.h> // more stuff ");
|
||||
assertSoleLocation(statements[0], code, "#include <notfound.h>");
|
||||
assertSoleLocation(statements[1], code, "#include <notfound1.h>");
|
||||
assertSoleLocation(statements[2], code, "#include <notfound2.h>");
|
||||
assertSoleLocation(decls[0], code, "int x;");
|
||||
}
|
||||
}
|
||||
|
@ -590,7 +588,7 @@ public class DOMLocationTests extends AST2BaseTest {
|
|||
IASTPreprocessorStatement [] statements = tu.getAllPreprocessorStatements();
|
||||
IASTProblem[] problems = tu.getPreprocessorProblems();
|
||||
assertEquals( 1, decls.length);
|
||||
assertEquals( 0, statements.length);
|
||||
assertEquals( 1, statements.length);
|
||||
assertEquals( 2, problems.length);
|
||||
assertSoleLocation(problems[0], code, "#include \"\"");
|
||||
assertSoleLocation(problems[1], code, "else");
|
||||
|
|
|
@ -210,7 +210,62 @@ public class IndexIncludeTest extends IndexTestBase {
|
|||
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 {
|
||||
int offset= content.indexOf(includeName);
|
||||
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
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - Initial API and implementation
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.model;
|
||||
|
||||
|
@ -32,4 +33,15 @@ public interface IInclude extends ICElement, ISourceReference, ISourceManipulati
|
|||
public String getFullFileName();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
// 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
|
||||
final IASTPreprocessorMacroDefinition[] macroDefinitions= ast.getMacroDefinitions();
|
||||
for (int i= 0; i < macroDefinitions.length; i++) {
|
||||
|
@ -347,6 +337,7 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
}
|
||||
if (problemRequestor != null && problemRequestor.isActive()) {
|
||||
problemRequestor.beginReporting();
|
||||
final IASTProblem[] ppProblems= ast.getPreprocessorProblems();
|
||||
IASTProblem[] problems= ppProblems;
|
||||
for (int i= 0; i < problems.length; i++) {
|
||||
IASTProblem problem= problems[i];
|
||||
|
@ -378,6 +369,8 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
final IASTName name= inclusion.getName();
|
||||
Include element= new Include(parent, ASTStringUtil.getSimpleName(name), inclusion.isSystemInclude());
|
||||
element.setFullPathName(inclusion.getPath());
|
||||
element.setActive(inclusion.isActive());
|
||||
element.setResolved(inclusion.isResolved());
|
||||
// add to parent
|
||||
parent.addChild(element);
|
||||
// set positions
|
||||
|
@ -386,35 +379,6 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
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{
|
||||
// create element
|
||||
final IASTName name= macro.getName();
|
||||
|
@ -425,7 +389,6 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
setIdentifierPosition(element, name);
|
||||
setBodyPosition(element, macro);
|
||||
return element;
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - Initial API and implementation
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.model;
|
||||
|
@ -18,7 +19,9 @@ public class Include extends SourceManipulation implements IInclude {
|
|||
|
||||
private final boolean standard;
|
||||
private String fullPath;
|
||||
|
||||
private boolean fIsActive= true;
|
||||
private boolean fIsResolved= true;
|
||||
|
||||
public Include(ICElement parent, String name, boolean isStandard) {
|
||||
super(parent, name, ICElement.C_INCLUDE);
|
||||
standard = isStandard;
|
||||
|
@ -54,4 +57,41 @@ public class Include extends SourceManipulation implements IInclude {
|
|||
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.
|
||||
* Only valid if {@link #isResolved()} returns <code>true</code>.
|
||||
*/
|
||||
public String getPath();
|
||||
|
||||
|
@ -44,4 +45,16 @@ public interface IASTPreprocessorIncludeStatement extends
|
|||
* @since 4.0
|
||||
*/
|
||||
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;
|
||||
|
||||
/**
|
||||
* Returns the IIndexFileLocation of the file that is included by this directive.
|
||||
* @return the IIndexFileLocation of the file that is included by this directive
|
||||
* Returns the IIndexFileLocation of the file that is included by this
|
||||
* 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
|
||||
*/
|
||||
IIndexFileLocation getIncludesLocation() throws CoreException;
|
||||
|
@ -72,4 +77,20 @@ public interface IIndexInclude {
|
|||
* @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
|
||||
* Bryan Wilkinson (QNX)
|
||||
* Andrew Ferguson (Symbian)
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.index;
|
||||
|
@ -151,6 +152,9 @@ public class CIndex implements IIndex {
|
|||
}
|
||||
|
||||
public IIndexFile resolveInclude(IIndexInclude include) throws CoreException {
|
||||
if (!include.isResolved()) {
|
||||
return null;
|
||||
}
|
||||
IIndexFragmentInclude fragmentInclude = (IIndexFragmentInclude) include;
|
||||
IIndexFragment frag= fragmentInclude.getFragment();
|
||||
if (isPrimaryFragment(frag)) {
|
||||
|
@ -380,7 +384,7 @@ public class CIndex implements IIndex {
|
|||
List result = new ArrayList();
|
||||
for (int i = 0; i < fFragments.length; i++) {
|
||||
IIndexFragmentBinding adapted = fFragments[i].adaptBinding(binding);
|
||||
if (adapted instanceof IIndexFragmentBinding) {
|
||||
if (adapted != null) {
|
||||
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
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -9,6 +9,7 @@
|
|||
* QNX - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
* Andrew Ferguson (Symbian)
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index;
|
||||
|
||||
|
@ -16,10 +17,12 @@ import java.io.File;
|
|||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
|
||||
|
@ -49,6 +52,7 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
|||
private Map/*<IIndexFileLocation,FileInfo>*/ fileInfoCache;
|
||||
private Map/*<String,IIndexFileLocation>*/ iflCache;
|
||||
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 */
|
||||
private ICodeReaderFactory fFallBackFactory;
|
||||
|
||||
|
@ -118,6 +122,10 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
|||
IIndexFileLocation incLocation = findLocation(canonicalPath);
|
||||
FileInfo info= createInfo(incLocation, null);
|
||||
|
||||
if (isIncluded(info)) {
|
||||
return new CodeReader(canonicalPath, EMPTY_CHARS);
|
||||
}
|
||||
|
||||
// try to build macro dictionary off index
|
||||
if (info.fFile != null) {
|
||||
try {
|
||||
|
@ -145,6 +153,7 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
|||
} catch (NeedToParseException e) {
|
||||
}
|
||||
}
|
||||
setIncluded(info);
|
||||
}
|
||||
catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
|
@ -157,6 +166,23 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
|||
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 {
|
||||
FileInfo info= (FileInfo) fileInfoCache.get(location);
|
||||
if (info == null) {
|
||||
|
@ -171,10 +197,13 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
|||
if (!target.add(fileInfo)) {
|
||||
return;
|
||||
}
|
||||
if (isIncluded(fileInfo)) {
|
||||
return;
|
||||
}
|
||||
if (fileInfo.fFile == null || fileInfo.isRequested()) {
|
||||
throw new NeedToParseException();
|
||||
}
|
||||
|
||||
|
||||
// Follow the includes
|
||||
IIndexFile file= fileInfo.fFile;
|
||||
IIndexInclude[] includeDirectives= file.getIncludes();
|
||||
|
@ -185,6 +214,7 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
|||
getInfosForMacroDictionary(nextInfo, target);
|
||||
}
|
||||
}
|
||||
setIncluded(fileInfo);
|
||||
}
|
||||
|
||||
public void clearMacroAttachements() {
|
||||
|
@ -198,6 +228,7 @@ public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
|
|||
}
|
||||
}
|
||||
usedMacros.clear();
|
||||
fIncluded.clear();
|
||||
}
|
||||
|
||||
public ICodeReaderCache getCodeReaderCache() {
|
||||
|
|
|
@ -2636,10 +2636,10 @@ abstract class BaseScanner implements IScanner {
|
|||
if (type != ppKeywords.undefined) {
|
||||
switch (type) {
|
||||
case ppInclude:
|
||||
handlePPInclude(pos, false, startingLineNumber);
|
||||
handlePPInclude(pos, false, startingLineNumber, true);
|
||||
return;
|
||||
case ppInclude_next:
|
||||
handlePPInclude(pos, true, startingLineNumber);
|
||||
handlePPInclude(pos, true, startingLineNumber, true);
|
||||
return;
|
||||
case ppDefine:
|
||||
handlePPDefine(pos, startingLineNumber);
|
||||
|
@ -2760,7 +2760,7 @@ abstract class BaseScanner implements IScanner {
|
|||
protected abstract void processIf(int startPos, int endPos, boolean taken);
|
||||
|
||||
protected void handlePPInclude(int pos2, boolean include_next,
|
||||
int startingLineNumber) {
|
||||
int startingLineNumber, boolean active) {
|
||||
char[] buffer = bufferStack[bufferStackPos];
|
||||
int limit = bufferLimit[bufferStackPos];
|
||||
|
||||
|
@ -2845,6 +2845,7 @@ abstract class BaseScanner implements IScanner {
|
|||
nameOffset= pos;
|
||||
int len= bufferPos[bufferStackPos] - nameOffset;
|
||||
nameEndOffset= nameOffset + len;
|
||||
endOffset= nameEndOffset;
|
||||
bufferPos[bufferStackPos]--;
|
||||
|
||||
Object expObject = definitions.get(buffer, nameOffset, len);
|
||||
|
@ -2874,19 +2875,46 @@ abstract class BaseScanner implements IScanner {
|
|||
}
|
||||
|
||||
if (filename == null || filename == EMPTY_STRING) {
|
||||
handleProblem(IProblem.PREPROCESSOR_INVALID_DIRECTIVE, startOffset,
|
||||
null);
|
||||
return;
|
||||
if (active) {
|
||||
handleProblem(IProblem.PREPROCESSOR_INVALID_DIRECTIVE, startOffset,
|
||||
null);
|
||||
return;
|
||||
}
|
||||
filename= new String(buffer, nameOffset, nameEndOffset - nameOffset);
|
||||
}
|
||||
char[] fileNameArray = filename.toCharArray();
|
||||
|
||||
// TODO else we need to do macro processing on the rest of the line
|
||||
endLine = getLineNumber(bufferPos[bufferStackPos]);
|
||||
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 fileNameArray
|
||||
* @param local
|
||||
|
@ -2922,6 +2950,7 @@ abstract class BaseScanner implements IScanner {
|
|||
endLine, false)));
|
||||
return;
|
||||
}
|
||||
processInclude(fileNameArray, local, true, startOffset, nameOffset, nameEndOffset, endOffset, startingLine, nameLine, endLine);
|
||||
handleProblem(IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, startOffset,
|
||||
fileNameArray);
|
||||
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,
|
||||
fileNameArray);
|
||||
}
|
||||
|
@ -3552,6 +3582,12 @@ abstract class BaseScanner implements IScanner {
|
|||
skipToNewLine();
|
||||
}
|
||||
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)
|
||||
*
|
||||
|
|
|
@ -74,7 +74,9 @@ public interface IScannerPreprocessorLog {
|
|||
public void encounterPoundUndef(int startOffset, int endOffset,
|
||||
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);
|
||||
|
||||
|
@ -83,5 +85,5 @@ public interface IScannerPreprocessorLog {
|
|||
public IMacroDefinition registerBuiltinDynamicFunctionStyleMacro(DynamicFunctionStyleMacro 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
|
||||
*/
|
||||
|
@ -454,7 +481,8 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
public int startOffset;
|
||||
public int endOffset;
|
||||
private boolean fSystemInclude;
|
||||
|
||||
private boolean fIsActive= true;
|
||||
private boolean fIsResolved= true;
|
||||
|
||||
/**
|
||||
* @param cs
|
||||
|
@ -463,11 +491,6 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
this.path = cs;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement#getPath()
|
||||
*/
|
||||
public String getPath() {
|
||||
return new String(path);
|
||||
}
|
||||
|
@ -491,6 +514,22 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
public void setSystemInclude(boolean 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 _IPreprocessorIncludeDirective extends _IPreprocessorDirective {
|
||||
}
|
||||
|
||||
protected class _Undef extends _Context implements
|
||||
_IPreprocessorDirective {
|
||||
|
@ -1216,7 +1257,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
}
|
||||
|
||||
protected static class _Inclusion extends _CompositeFileContext implements
|
||||
_IPreprocessorDirective {
|
||||
_IPreprocessorIncludeDirective {
|
||||
|
||||
public final int fNameOffset;
|
||||
public final int fNameEndOffset;
|
||||
|
@ -1539,7 +1580,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
collectContexts(V_INCLUSIONS, tu, contexts, 0);
|
||||
IASTPreprocessorIncludeStatement[] result = new IASTPreprocessorIncludeStatement[size];
|
||||
for (int i = 0; i < size; ++i)
|
||||
result[i] = createASTInclusion(((_Inclusion) contexts[i]));
|
||||
result[i] = (IASTPreprocessorIncludeStatement)createPreprocessorStatement(contexts[i]);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -1561,6 +1602,26 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
result.setParent(rootNode);
|
||||
result.setPropertyInParent(IASTTranslationUnit.PREPROCESSOR_STATEMENT);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1587,6 +1648,8 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
IASTPreprocessorStatement result = null;
|
||||
if (context instanceof _Inclusion)
|
||||
result = createASTInclusion(((_Inclusion) context));
|
||||
else if (context instanceof _Include)
|
||||
result = createASTInclusion(((_Include) context));
|
||||
else if (context instanceof _MacroDefinition)
|
||||
result = createASTMacroDefinition((_MacroDefinition) context);
|
||||
else if (context instanceof _Undef)
|
||||
|
@ -2171,6 +2234,14 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
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)
|
||||
*
|
||||
|
@ -2256,7 +2327,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
++count;
|
||||
break;
|
||||
case V_INCLUSIONS:
|
||||
if (source instanceof _Inclusion) {
|
||||
if (source instanceof _IPreprocessorIncludeDirective) {
|
||||
if (result != null)
|
||||
result[startAt++] = source;
|
||||
++count;
|
||||
|
@ -2264,7 +2335,6 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
|
|||
break;
|
||||
case V_PROBLEMS:
|
||||
if (source instanceof _Problem) {
|
||||
|
||||
if (result != null)
|
||||
result[startAt++] = source;
|
||||
++count;
|
||||
|
|
|
@ -42,6 +42,8 @@ public class PDOMInclude implements IIndexFragmentInclude {
|
|||
private static final int FLAG_OFFSET = 26;
|
||||
|
||||
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;
|
||||
|
||||
|
@ -67,6 +69,12 @@ public class PDOMInclude implements IIndexFragmentInclude {
|
|||
if (include.isSystemInclude()) {
|
||||
flags |= FLAG_SYSTEM_INCLUDE;
|
||||
}
|
||||
if (!include.isActive()) {
|
||||
flags |= FLAG_INACTIVE_INCLUDE;
|
||||
}
|
||||
if (!include.isResolved()) {
|
||||
flags |= FLAG_UNRESOLVED_INCLUDE;
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
@ -169,6 +177,14 @@ public class PDOMInclude implements IIndexFragmentInclude {
|
|||
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 {
|
||||
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_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_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_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_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_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_ERROR= create(T_OVR, "error_co.gif"); //$NON-NLS-1$
|
||||
|
|
|
@ -122,7 +122,7 @@ public class IBContentProvider extends AsyncTreeContentProvider {
|
|||
name, include.getNameOffset(),
|
||||
include.getNameLength(),
|
||||
include.getIncludedBy().getTimestamp());
|
||||
newnode.setIsActiveCode(true);
|
||||
newnode.setIsActiveCode(include.isActive());
|
||||
newnode.setIsSystemInclude(include.isSystemInclude());
|
||||
result.add(newnode);
|
||||
}
|
||||
|
|
|
@ -81,6 +81,9 @@ public class IBLabelProvider extends LabelProvider implements IColorProvider {
|
|||
if (node.isSystemInclude()) {
|
||||
flags |= CElementImageDescriptor.SYSTEM_INCLUDE;
|
||||
}
|
||||
if (!node.isActiveCode()) {
|
||||
flags |= CElementImageDescriptor.INACTIVE;
|
||||
}
|
||||
|
||||
if (node.isRecursive()) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -12,25 +12,6 @@
|
|||
*******************************************************************************/
|
||||
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.IProject;
|
||||
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.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.
|
||||
|
@ -48,7 +51,7 @@ import org.eclipse.ui.model.IWorkbenchAdapter;
|
|||
public class CElementImageProvider {
|
||||
|
||||
/**
|
||||
* Flags for the CImageLabelProvider:
|
||||
* Flags for the CElementImageProvider:
|
||||
* Generate images with overlays.
|
||||
*/
|
||||
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
|
||||
* and element properties. If configured, overlay icons are constructed for
|
||||
* <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) {
|
||||
ImageDescriptor descriptor= null;
|
||||
|
@ -365,7 +368,6 @@ public class CElementImageProvider {
|
|||
case ICElement.C_TEMPLATE_METHOD:
|
||||
case ICElement.C_TEMPLATE_METHOD_DECLARATION:
|
||||
try {
|
||||
|
||||
IMethodDeclaration md= (IMethodDeclaration)celement;
|
||||
ASTAccessVisibility visibility =md.getVisibility();
|
||||
return getMethodImageDescriptor(visibility);
|
||||
|
@ -405,8 +407,9 @@ public class CElementImageProvider {
|
|||
case ICElement.C_USING:
|
||||
return getUsingImageDescriptor();
|
||||
|
||||
default:
|
||||
return getImageDescriptor(type);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
@ -415,24 +418,32 @@ public class CElementImageProvider {
|
|||
private int computeCAdornmentFlags(ICElement element, int renderFlags) {
|
||||
|
||||
int flags= computeBasicAdornmentFlags(element, renderFlags);
|
||||
|
||||
try {
|
||||
if (showOverlayIcons(renderFlags) && element instanceof IDeclaration) {
|
||||
IDeclaration decl = (IDeclaration) element;
|
||||
if(decl.isStatic()){
|
||||
flags |= CElementImageDescriptor.STATIC;
|
||||
}
|
||||
if(decl.isConst()){
|
||||
flags |= CElementImageDescriptor.CONSTANT;
|
||||
}
|
||||
if(decl.isVolatile()){
|
||||
flags |= CElementImageDescriptor.VOLATILE;
|
||||
}
|
||||
if(element instanceof ITemplate){
|
||||
flags |= CElementImageDescriptor.TEMPLATE;
|
||||
if (showOverlayIcons(renderFlags)) {
|
||||
try {
|
||||
if (element instanceof IDeclaration) {
|
||||
IDeclaration decl = (IDeclaration) element;
|
||||
if(decl.isStatic()){
|
||||
flags |= CElementImageDescriptor.STATIC;
|
||||
}
|
||||
if(decl.isConst()){
|
||||
flags |= CElementImageDescriptor.CONSTANT;
|
||||
}
|
||||
if(decl.isVolatile()){
|
||||
flags |= CElementImageDescriptor.VOLATILE;
|
||||
}
|
||||
if(element instanceof ITemplate){
|
||||
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;
|
||||
}
|
||||
|
@ -444,7 +455,7 @@ public class CElementImageProvider {
|
|||
}
|
||||
if ((renderFlags & OVERLAY_WARNING) !=0) {
|
||||
flags |= CElementImageDescriptor.WARNING;
|
||||
}
|
||||
}
|
||||
// if ((renderFlags & OVERLAY_OVERRIDE) !=0) {
|
||||
// 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
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
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.ILabelProviderListener;
|
||||
import org.eclipse.jface.viewers.LabelProvider;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.graphics.Color;
|
||||
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 {
|
||||
|
||||
protected CElementImageProvider fImageLabelProvider;
|
||||
|
@ -29,6 +34,7 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider {
|
|||
|
||||
private int fImageFlags;
|
||||
private int fTextFlags;
|
||||
private Color fInactiveColor;
|
||||
|
||||
/**
|
||||
* 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 imageFlags Flags defined in <code>JavaElementImageProvider</code>.
|
||||
* @param textFlags Flags defined in <code>CElementLabels</code>.
|
||||
* @param imageFlags Flags defined in <code>CElementImageProvider</code>.
|
||||
*/
|
||||
public CUILabelProvider(int textFlags, int imageFlags) {
|
||||
fImageLabelProvider= new CElementImageProvider();
|
||||
|
@ -48,6 +54,7 @@ public class CUILabelProvider extends LabelProvider implements IColorProvider {
|
|||
fStorageLabelProvider= new StorageLabelProvider();
|
||||
fImageFlags= imageFlags;
|
||||
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)
|
||||
*/
|
||||
public Color getForeground(Object element) {
|
||||
if (element instanceof IInclude) {
|
||||
IInclude include= (IInclude)element;
|
||||
if (!include.isActive()) {
|
||||
return fInactiveColor;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -88,12 +88,15 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
|
|||
/** Flag to render the 'defines' adornment in the type hierarchy*/
|
||||
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 int fFlags;
|
||||
private Point fSize;
|
||||
|
||||
/**
|
||||
* Create a new JavaElementImageDescriptor.
|
||||
* Create a new CElementImageDescriptor.
|
||||
*
|
||||
* @param baseImage an image descriptor used as the base image
|
||||
* @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;
|
||||
// drawImage(data, x, size.y - data.height);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
private void drawTopLeft() {
|
||||
ImageData data= null;
|
||||
|
@ -263,8 +266,12 @@ public class CElementImageDescriptor extends CompositeImageDescriptor {
|
|||
data= CPluginImages.DESC_OVR_DEFINES.getImageData();
|
||||
drawImage(data, 0, 0);
|
||||
}
|
||||
if ((fFlags & INACTIVE) != 0) {
|
||||
data= CPluginImages.DESC_OVR_INACTIVE.getImageData();
|
||||
drawImage(data, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void drawBottomLeft() {
|
||||
Point size= getSize();
|
||||
int x= 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue