mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-09-10 12:03:16 +02:00
Lazy initialization of LookupData.fTemplateArguments to avoid exceptions
in constructor. Change-Id: I875233c7fe40ab4a56d9b76fb03c2e03441d29ae
This commit is contained in:
parent
bea6a49e5b
commit
5d54cc3996
2 changed files with 30 additions and 25 deletions
|
@ -463,7 +463,7 @@ public class CPPSemantics {
|
||||||
} else {
|
} else {
|
||||||
// Do not interpret template arguments to a template class as being
|
// Do not interpret template arguments to a template class as being
|
||||||
// explicit template arguments to its templated constructor.
|
// explicit template arguments to its templated constructor.
|
||||||
data.fTemplateArguments = null;
|
data.setTemplateArguments(null);
|
||||||
binding= CPPSemantics.resolveFunction(data, ClassTypeHelper.getConstructors(cls, lookupPoint), true);
|
binding= CPPSemantics.resolveFunction(data, ClassTypeHelper.getConstructors(cls, lookupPoint), true);
|
||||||
}
|
}
|
||||||
} catch (DOMException e) {
|
} catch (DOMException e) {
|
||||||
|
@ -1162,7 +1162,7 @@ public class CPPSemantics {
|
||||||
char[] tchars= new char[typeDtorChars.length - 1];
|
char[] tchars= new char[typeDtorChars.length - 1];
|
||||||
System.arraycopy(typeDtorChars, 1, tchars, 0, tchars.length);
|
System.arraycopy(typeDtorChars, 1, tchars, 0, tchars.length);
|
||||||
|
|
||||||
LookupData ld2= new LookupData(tchars, data.fTemplateArguments, data.getLookupPoint());
|
LookupData ld2= new LookupData(tchars, data.getTemplateArguments(), data.getLookupPoint());
|
||||||
ld2.setIgnorePointOfDeclaration(data.isIgnorePointOfDeclaration());
|
ld2.setIgnorePointOfDeclaration(data.isIgnorePointOfDeclaration());
|
||||||
ld2.contentAssist= data.contentAssist;
|
ld2.contentAssist= data.contentAssist;
|
||||||
ld2.fNoNarrowing= data.fNoNarrowing;
|
ld2.fNoNarrowing= data.fNoNarrowing;
|
||||||
|
@ -2469,7 +2469,7 @@ public class CPPSemantics {
|
||||||
// No arguments to resolve function
|
// No arguments to resolve function
|
||||||
final IASTNode lookupPoint = data.getLookupPoint();
|
final IASTNode lookupPoint = data.getLookupPoint();
|
||||||
if (!data.hasFunctionArguments()) {
|
if (!data.hasFunctionArguments()) {
|
||||||
return createFunctionSet(fns, data.fTemplateArguments, lookupPoint, lookupName);
|
return createFunctionSet(fns, data.getTemplateArguments(), lookupPoint, lookupName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reduce our set of candidate functions to only those who have the right number of parameters
|
// Reduce our set of candidate functions to only those who have the right number of parameters
|
||||||
|
@ -2477,7 +2477,7 @@ public class CPPSemantics {
|
||||||
ICPPFunction[] tmp= selectByArgumentCount(data, fns);
|
ICPPFunction[] tmp= selectByArgumentCount(data, fns);
|
||||||
if (tmp.length == 0 || tmp[0] == null)
|
if (tmp.length == 0 || tmp[0] == null)
|
||||||
return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
|
return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns);
|
||||||
tmp= CPPTemplates.instantiateForFunctionCall(tmp, data.fTemplateArguments,
|
tmp= CPPTemplates.instantiateForFunctionCall(tmp, data.getTemplateArguments(),
|
||||||
Arrays.asList(argTypes),
|
Arrays.asList(argTypes),
|
||||||
Arrays.asList(data.getFunctionArgumentValueCategories()),
|
Arrays.asList(data.getFunctionArgumentValueCategories()),
|
||||||
data.argsContainImpliedObject, lookupPoint);
|
data.argsContainImpliedObject, lookupPoint);
|
||||||
|
|
|
@ -16,7 +16,10 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
|
||||||
|
|
||||||
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getSimplifiedType;
|
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getSimplifiedType;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
|
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
|
||||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
|
||||||
|
@ -73,15 +76,11 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPCompositeBinding;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPCompositeBinding;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Context data for IASTName lookup
|
* Context data for IASTName lookup
|
||||||
*/
|
*/
|
||||||
public class LookupData extends ScopeLookupData {
|
public class LookupData extends ScopeLookupData {
|
||||||
public ICPPTemplateArgument[] fTemplateArguments;
|
private static final ICPPTemplateArgument[] UNINITIALIZED_TEMPLATE_ARGUMENTS = {};
|
||||||
public Map<ICPPNamespaceScope, List<ICPPNamespaceScope>> usingDirectives= Collections.emptyMap();
|
public Map<ICPPNamespaceScope, List<ICPPNamespaceScope>> usingDirectives= Collections.emptyMap();
|
||||||
|
|
||||||
/** Used to ensure we don't visit things more than once. */
|
/** Used to ensure we don't visit things more than once. */
|
||||||
|
@ -114,26 +113,16 @@ public class LookupData extends ScopeLookupData {
|
||||||
private ICPPEvaluation[] functionArgs;
|
private ICPPEvaluation[] functionArgs;
|
||||||
private IType[] functionArgTypes;
|
private IType[] functionArgTypes;
|
||||||
private ValueCategory[] functionArgValueCategories;
|
private ValueCategory[] functionArgValueCategories;
|
||||||
|
private ICPPTemplateArgument[] fTemplateArguments = UNINITIALIZED_TEMPLATE_ARGUMENTS;
|
||||||
|
|
||||||
public ICPPClassType skippedScope;
|
public ICPPClassType skippedScope;
|
||||||
public Object foundItems;
|
public Object foundItems;
|
||||||
public ProblemBinding problem;
|
public ProblemBinding problem;
|
||||||
|
|
||||||
public LookupData(IASTName n) {
|
public LookupData(IASTName name) {
|
||||||
super(n, true, false);
|
super(name, true, false);
|
||||||
if (n == null)
|
fTemplateArguments = UNINITIALIZED_TEMPLATE_ARGUMENTS; // Lazy initialization to avoid DOMException.
|
||||||
throw new IllegalArgumentException();
|
configureWith(name);
|
||||||
|
|
||||||
ICPPTemplateArgument[] args = null;
|
|
||||||
if (n instanceof ICPPASTTemplateId) {
|
|
||||||
try {
|
|
||||||
args= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) n);
|
|
||||||
} catch (DOMException e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fTemplateArguments= args;
|
|
||||||
configureWith(n);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public LookupData(char[] name, ICPPTemplateArgument[] templateArgs, IASTNode lookupPoint) {
|
public LookupData(char[] name, ICPPTemplateArgument[] templateArgs, IASTNode lookupPoint) {
|
||||||
|
@ -563,6 +552,22 @@ public class LookupData extends ScopeLookupData {
|
||||||
return functionArgValueCategories;
|
return functionArgValueCategories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ICPPTemplateArgument[] getTemplateArguments() throws DOMException {
|
||||||
|
if (fTemplateArguments == UNINITIALIZED_TEMPLATE_ARGUMENTS) {
|
||||||
|
IASTName name = getLookupName();
|
||||||
|
if (name instanceof ICPPASTTemplateId) {
|
||||||
|
fTemplateArguments = CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) name);
|
||||||
|
} else {
|
||||||
|
fTemplateArguments = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fTemplateArguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setTemplateArguments(ICPPTemplateArgument[] fTemplateArguments) {
|
||||||
|
this.fTemplateArguments = fTemplateArguments;
|
||||||
|
}
|
||||||
|
|
||||||
public int getFunctionArgumentCount() {
|
public int getFunctionArgumentCount() {
|
||||||
if (functionArgs != null)
|
if (functionArgs != null)
|
||||||
return functionArgs.length;
|
return functionArgs.length;
|
||||||
|
|
Loading…
Add table
Reference in a new issue