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

Improved error reporting.

This commit is contained in:
Sergey Prigogin 2012-08-15 14:08:24 -07:00
parent 1585de5af4
commit e65a79e4cc
4 changed files with 93 additions and 60 deletions

View file

@ -42,12 +42,12 @@ import com.ibm.icu.text.MessageFormat;
*/
public class ProblemBinding extends PlatformObject implements IProblemBinding, IASTInternalScope {
public static ProblemBinding NOT_INITIALIZED= new ProblemBinding(null, 0);
protected final int id;
protected char[] arg;
protected IASTNode node;
private IBinding[] candidateBindings;
public ProblemBinding(IASTName name, int id) {
this(name, id, null, null);
}
@ -56,6 +56,37 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
this(name, id, null, candidateBindings);
}
/**
* @param name the name that could not be resolved, may be {@code null}
* @param point the point in code where the problem was encountered
* @param id the ID of the problem, see {@link IProblemBinding}
*/
public ProblemBinding(IASTName name, IASTNode point, int id) {
this(name, point, id, null);
}
/**
* @param name the name that could not be resolved, may be {@code null}
* @param point the point in code where the problem was encountered
* @param id the ID of the problem, see {@link IProblemBinding}
* @param candidateBindings candidate bindings that were rejected due to ambiguity or for other
* reasons, may be {@code null}
*/
public ProblemBinding(IASTName name, IASTNode point, int id, IBinding[] candidateBindings) {
this.id = id;
if (name != null && name.getTranslationUnit() != null) {
this.node = name;
} else {
this.node = point;
if (name != null) {
this.arg = name.getSimpleID();
} else if (candidateBindings != null && candidateBindings.length != 0) {
this.arg = candidateBindings[0].getNameCharArray();
}
}
this.candidateBindings = candidateBindings;
}
public ProblemBinding(IASTNode node, int id, char[] arg) {
this(node, id, arg, null);
}
@ -66,8 +97,8 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
this.node = node;
this.candidateBindings = candidateBindings;
}
@Override
@Override
public EScopeKind getKind() {
return EScopeKind.eLocal;
}
@ -81,28 +112,22 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
public IBinding[] getCandidateBindings() {
return candidateBindings != null ? candidateBindings : IBinding.EMPTY_BINDING_ARRAY;
}
public void setCandidateBindings(IBinding[] foundBindings) {
candidateBindings= foundBindings;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IProblemBinding#getID()
*/
@Override
public int getID() {
return id;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IProblemBinding#getMessage()
*/
@Override
public String getMessage() {
String msg = ParserMessages.getProblemPattern(this);
if (msg == null)
return ""; //$NON-NLS-1$
if (arg == null) {
if (node instanceof IASTName) {
arg= ((IASTName) node).toCharArray();
@ -110,7 +135,7 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
arg = candidateBindings[0].getNameCharArray();
}
}
if (arg != null) {
msg = MessageFormat.format(msg, new Object[] { new String(arg) });
}
@ -150,7 +175,7 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
return getASTNode();
}
@Override
public Object clone() {
// Don't clone problems
@ -263,7 +288,7 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
public ILinkage getLinkage() {
return Linkage.NO_LINKAGE;
}
@Override
public String toString() {
return getMessage();
@ -292,7 +317,8 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
}
@Override
public void removeNestedFromCache(IASTNode container) {}
public void removeNestedFromCache(IASTNode container) {
}
// Dummy methods for derived classes
public IType getType() {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2010 IBM Corporation and others.
* Copyright (c) 2005, 2012 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
@ -87,7 +87,7 @@ public class CPPClassSpecialization extends CPPSpecialization
fInProgress.set(set);
}
if (!set.add(original))
return new RecursionResolvingBinding(null, null);
return new RecursionResolvingBinding(point, original.getNameCharArray());
}
IBinding result= CPPTemplates.createSpecialization(this, original, point);

View file

@ -258,7 +258,7 @@ public class CPPSemantics {
((CPPASTNameBase) name).incResolutionDepth();
}
// 1: Get some context info off of the name to figure out what kind of lookup we want
// 1: Get some context info off of the name to figure out what kind of lookup we want.
LookupData data = createLookupData(name);
try {
@ -375,13 +375,13 @@ public class CPPSemantics {
node= node.getParent();
}
if (!ok) {
binding = new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_INVALID_TYPE,
data.getFoundBindings());
binding = new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_INVALID_TYPE, data.getFoundBindings());
}
}
}
} else if (binding instanceof ICPPDeferredClassInstance) {
// try to replace binding by the one pointing to the enclosing template declaration.
// Try to replace binding by the one pointing to the enclosing template declaration.
ICPPDeferredClassInstance dcl= (ICPPDeferredClassInstance) binding;
IBinding usedHere= CPPTemplates.isUsedInClassTemplateScope(dcl.getClassTemplate(), lookupName);
if (usedHere instanceof ICPPClassTemplatePartialSpecialization) {
@ -463,13 +463,13 @@ public class CPPSemantics {
if (parent instanceof IASTTypeId && parent.getPropertyInParent() == ICPPASTTemplateId.TEMPLATE_ID_ARGUMENT) {
if (!(binding instanceof IType)) {
// a type id needs to hold a type
binding = new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_INVALID_TYPE,
data.getFoundBindings());
binding = new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_INVALID_TYPE, data.getFoundBindings());
}
// don't create a problem here
} else {
binding = new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_INVALID_TYPE,
data.getFoundBindings());
binding = new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_INVALID_TYPE, data.getFoundBindings());
}
}
} else if (namePropertyInParent == IASTIdExpression.ID_NAME) {
@ -484,8 +484,8 @@ public class CPPSemantics {
&& ((ICPPASTUnaryExpression) idExpr.getParent()).getOperator() == IASTUnaryExpression.op_sizeofParameterPack) {
// Argument of sizeof... can be a type
} else {
binding= new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_INVALID_TYPE,
data.getFoundBindings());
binding= new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_INVALID_TYPE, data.getFoundBindings());
}
}
}
@ -515,11 +515,11 @@ public class CPPSemantics {
// If we're still null...
if (binding == null) {
if (name instanceof ICPPASTQualifiedName && declaration != null) {
binding = new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_MEMBER_DECLARATION_NOT_FOUND,
data.getFoundBindings());
binding = new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_MEMBER_DECLARATION_NOT_FOUND, data.getFoundBindings());
} else {
binding = new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND,
data.getFoundBindings());
binding = new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_NAME_NOT_FOUND, data.getFoundBindings());
}
}
return binding;
@ -1894,8 +1894,9 @@ public class CPPSemantics {
private static IBinding resolveAmbiguities(LookupData data) throws DOMException {
if (!data.hasResults() || data.contentAssist)
return null;
final IASTName lookupName = data.getLookupName();
IASTNode lookupPoint = data.getLookupPoint();
final boolean indexBased= data.getIndex() != null;
final boolean checkWholeClass= lookupName == null || LookupData.checkWholeClassScope(lookupName);
@SuppressWarnings("unchecked")
@ -1908,7 +1909,7 @@ public class CPPSemantics {
Object[] items = (Object[]) data.foundItems;
for (int i = 0; i < items.length && items[i] != null; i++) {
Object o = items[i];
boolean declaredBefore = data.isIgnorePointOfDeclaration() || declaredBefore(o, data.getLookupPoint(), indexBased);
boolean declaredBefore = data.isIgnorePointOfDeclaration() || declaredBefore(o, lookupPoint, indexBased);
boolean checkResolvedNamesOnly= false;
if (!checkWholeClass && !declaredBefore) {
if (lookupName != null && lookupName.getRoleOfName(false) != IASTNameOwner.r_reference) {
@ -1983,8 +1984,8 @@ public class CPPSemantics {
type= temp;
}
} else {
return new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP,
data.getFoundBindings());
return new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.getFoundBindings());
}
}
}
@ -1998,8 +1999,8 @@ public class CPPSemantics {
if (c < 0) {
obj= temp;
} else if (c == 0) {
return new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP,
data.getFoundBindings());
return new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.getFoundBindings());
}
}
}
@ -2012,8 +2013,8 @@ public class CPPSemantics {
IFunction[] fnArray= fns.keyArray(IFunction.class);
cmp= compareByRelevance(data, obj, fnArray);
if (cmp == 0) {
return new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP,
data.getFoundBindings());
return new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.getFoundBindings());
}
}
}
@ -2057,8 +2058,8 @@ public class CPPSemantics {
if (obj != null) {
int cmp= compareByRelevance(data, obj, fnArray);
if (cmp == 0) {
return new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP,
data.getFoundBindings());
return new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.getFoundBindings());
}
if (cmp > 0) {
return obj;
@ -2363,8 +2364,9 @@ public class CPPSemantics {
Arrays.asList(argTypes),
Arrays.asList(data.getFunctionArgumentValueCategories()),
data.argsContainImpliedObject, lookupPoint);
if (tmp.length == 0 || tmp[0] == null)
return new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
if (tmp.length == 0 || tmp[0] == null) {
return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
}
int viableCount= 0;
for (IFunction f : tmp) {
@ -2377,7 +2379,7 @@ public class CPPSemantics {
++viableCount;
}
if (viableCount == 0)
return new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
// Check for dependent arguments
fns= tmp;
@ -2450,12 +2452,12 @@ public class CPPSemantics {
if (ambiguousFunctions != null) {
ambiguousFunctions= ArrayUtil.append(IFunction.class, ambiguousFunctions, bestFnCost.getFunction());
return new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP,
ambiguousFunctions);
return new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, ambiguousFunctions);
}
if (bestFnCost.hasAmbiguousUserDefinedConversion()) {
return new ProblemBinding(lookupName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP,
data.getFoundBindings());
return new ProblemBinding(lookupName, lookupPoint,
IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.getFoundBindings());
}
for (int i = 0; i < argTypes.length; i++) {
@ -2590,7 +2592,8 @@ public class CPPSemantics {
}
}
if (isAmbiguous)
return new ProblemBinding(data.getLookupName(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, fns);
return new ProblemBinding(data.getLookupName(), data.getLookupPoint(),
IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, fns);
return bestInst;
}
@ -2738,7 +2741,8 @@ public class CPPSemantics {
ICPPASTConversionName astName= (ICPPASTConversionName) data.getLookupName();
IType t= CPPVisitor.createType(astName.getTypeId());
if (t instanceof ISemanticProblem) {
return new ProblemBinding(astName, IProblemBinding.SEMANTIC_INVALID_TYPE, data.getFoundBindings());
return new ProblemBinding(astName, data.getLookupPoint(),
IProblemBinding.SEMANTIC_INVALID_TYPE, data.getFoundBindings());
}
if (data.forDeclaration() == null ||
data.forExplicitFunctionSpecialization() || data.forExplicitFunctionInstantiation()) {
@ -2758,7 +2762,8 @@ public class CPPSemantics {
}
if (unknown != null)
return unknown;
return new ProblemBinding(astName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, data.getFoundBindings());
return new ProblemBinding(astName, data.getLookupPoint(),
IProblemBinding.SEMANTIC_NAME_NOT_FOUND, data.getFoundBindings());
}
/**
@ -3670,7 +3675,7 @@ public class CPPSemantics {
data.typesOnly= unknown instanceof IType;
try {
// 2: lookup
// 2: Lookup
lookup(data, scope);
} catch (DOMException e) {
data.problem = (ProblemBinding) e.getProblem();
@ -3679,7 +3684,7 @@ public class CPPSemantics {
if (data.problem != null)
return data.problem;
// 3: resolve ambiguities
// 3: Resolve ambiguities
IBinding binding;
try {
binding = resolveAmbiguities(data);
@ -3688,7 +3693,7 @@ public class CPPSemantics {
}
// 4: Normal post processing is not possible, because the name is not rooted in AST
if (binding == null)
binding = new ProblemBinding(unknownName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND);
binding = new ProblemBinding(unknownName, point, IProblemBinding.SEMANTIC_NAME_NOT_FOUND);
return binding;
}

View file

@ -989,7 +989,8 @@ public class CPPTemplates {
origType= ((ICPPParameterPackType) origType).getType();
int packSize= determinePackSize(origType, tpMap);
if (packSize == PACK_SIZE_FAIL || packSize == PACK_SIZE_NOT_FOUND) {
newType= new ProblemBinding(null, IProblemBinding.SEMANTIC_INVALID_TYPE);
newType= new ProblemBinding(point, IProblemBinding.SEMANTIC_INVALID_TYPE,
types[i] instanceof IBinding ? ((IBinding) types[i]).getNameCharArray() : null);
} else if (packSize == PACK_SIZE_DEFER) {
newType= origType;
} else {
@ -1034,7 +1035,7 @@ public class CPPTemplates {
origArg= origArg.getExpansionPattern();
int packSize= determinePackSize(origArg, tpMap);
if (packSize == PACK_SIZE_FAIL || packSize == PACK_SIZE_NOT_FOUND) {
throw new DOMException(new ProblemBinding(null, IProblemBinding.SEMANTIC_INVALID_TEMPLATE_ARGUMENTS));
throw new DOMException(new ProblemBinding(point, IProblemBinding.SEMANTIC_INVALID_TEMPLATE_ARGUMENTS, null));
} else if (packSize == PACK_SIZE_DEFER) {
newArg= origArg;
} else {
@ -1150,7 +1151,8 @@ public class CPPTemplates {
ICPPTemplateArgument[] args = tpMap.getPackExpansion(tpar);
if (args != null) {
if (packOffset >= args.length) {
return new ProblemBinding(null, IProblemBinding.SEMANTIC_INVALID_TYPE);
return new ProblemBinding(point, IProblemBinding.SEMANTIC_INVALID_TYPE,
tpar.getNameCharArray());
}
arg= args[packOffset];
}
@ -2430,7 +2432,7 @@ public class CPPTemplates {
}
}
} else if (t != owner) {
return new ProblemBinding(unknown.getUnknownName(), IProblemBinding.SEMANTIC_BAD_SCOPE);
return new ProblemBinding(unknown.getUnknownName(), point, IProblemBinding.SEMANTIC_BAD_SCOPE);
}
}