use of org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.ConstraintVariable2 in project che by eclipse.
the class InferTypeArgumentsTCModel method createTypeVariablesEqualityConstraints.
/**
* Create equality constraints between generic type variables of expressionCv and referenceCv.
* For example, the generic interface <code>java.lang.Iterable<E></code> defines a method
* <code>Iterator<E> iterator()</code>. Given
* <ul>
* <li>an expressionCv of a subtype of <code>Iterable</code>,</li>
* <li>a referenceCv of a subtype of <code>Iterator</code>, and</li>
* <li>a reference binding of the Iterable#iterator()'s return type (the parameterized type <code>Iterator<E></code>),</li>
* </ul>
* this method creates an equality constraint between the type variable E in expressionCV and
* the type variable E in referenceCV.
*
* @param expressionCv the type constraint variable of an expression
* @param methodTypeVariables
* @param referenceCv the type constraint variable of a type reference
* @param reference the declared type reference
*/
public void createTypeVariablesEqualityConstraints(ConstraintVariable2 expressionCv, Map<String, IndependentTypeVariable2> methodTypeVariables, ConstraintVariable2 referenceCv, TType reference) {
if (reference.isParameterizedType() || reference.isRawType()) {
TType[] referenceTypeArguments = null;
if (reference.isParameterizedType()) {
referenceTypeArguments = ((ParameterizedType) reference).getTypeArguments();
}
TType[] referenceTypeParameters = ((GenericType) reference.getTypeDeclaration()).getTypeParameters();
for (int i = 0; i < referenceTypeParameters.length; i++) {
TypeVariable referenceTypeParameter = (TypeVariable) referenceTypeParameters[i];
TType referenceTypeArgument;
if (referenceTypeArguments == null)
referenceTypeArgument = referenceTypeParameter.getErasure();
else
referenceTypeArgument = referenceTypeArguments[i];
if (referenceTypeArgument.isTypeVariable()) {
ConstraintVariable2 referenceTypeArgumentCv = getElementTypeCv(referenceTypeArgument, expressionCv, methodTypeVariables);
CollectionElementVariable2 referenceTypeParametersCv = getElementVariable(referenceCv, referenceTypeParameter);
createEqualsConstraint(referenceTypeArgumentCv, referenceTypeParametersCv);
} else if (referenceTypeArgument.isWildcardType()) {
//block it for now (bug 106174)
ConstraintVariable2 referenceTypeArgumentCv = makeImmutableTypeVariable(fTypeEnvironment.VOID);
CollectionElementVariable2 referenceTypeParametersCv = getElementVariable(referenceCv, referenceTypeParameter);
createEqualsConstraint(referenceTypeArgumentCv, referenceTypeParametersCv);
// WildcardType wildcardType= (WildcardType) referenceTypeArgument;
// if (wildcardType.isUnboundWildcardType()) {
// ConstraintVariable2 referenceTypeArgumentCv= makeImmutableTypeVariable(wildcardType);
// CollectionElementVariable2 referenceTypeParametersCv= getElementVariable(referenceCv, referenceTypeParameter);
// createEqualsConstraint(referenceTypeArgumentCv, referenceTypeParametersCv);
// } else if (wildcardType.isSuperWildcardType() && wildcardType.getBound().isTypeVariable()) {
// ConstraintVariable2 referenceTypeArgumentBoundCv= getElementTypeCv(wildcardType.getBound(), expressionCv, methodTypeVariables);
// CollectionElementVariable2 referenceTypeParametersCv= getElementVariable(referenceCv, referenceTypeParameter);
// //TODO: need *strict* subtype constraint?
// createSubtypeConstraint(referenceTypeParametersCv, referenceTypeArgumentBoundCv);
// }
// else: TODO
// } else if (referenceTypeArgument.isParameterizedType()) {
// //TODO: nested containers
// ParameterizedType parameterizedType= (ParameterizedType) referenceTypeArgument;
// ParameterizedTypeVariable2 parameterizedTypeCv= makeParameterizedTypeVariable(parameterizedType.getTypeDeclaration());
// CollectionElementVariable2 referenceTypeParametersCv= getElementVariable(referenceCv, referenceTypeParameter);
// createEqualsConstraint(parameterizedTypeCv, referenceTypeParametersCv);
// createElementEqualsConstraints(parameterizedTypeCv, referenceTypeParametersCv);
} else {
//TODO
}
}
} else if (reference.isArrayType()) {
TType elementType = ((ArrayType) reference).getElementType();
if (elementType.isRawType())
elementType = elementType.getErasure();
ConstraintVariable2 elementTypeCv = getElementTypeCv(elementType, expressionCv, methodTypeVariables);
ArrayElementVariable2 arrayElementTypeCv = getArrayElementVariable(referenceCv);
createEqualsConstraint(elementTypeCv, arrayElementTypeCv);
}
}
use of org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.ConstraintVariable2 in project che by eclipse.
the class ParametricStructureComputer method dumpContainerStructure.
private void dumpContainerStructure() {
//$NON-NLS-1$
System.out.println("\n*** Container Structure: ***\n");
for (int i = 0; i < fAllConstraintVariables.length; i++) {
ConstraintVariable2 v = fAllConstraintVariables[i];
if (elemStructure(v) != null && !(elemStructure(v) == ParametricStructure.NONE))
//$NON-NLS-1$ //$NON-NLS-2$
System.out.println("elemStructure(" + v.toString() + ") = " + elemStructure(v));
}
System.out.println();
}
use of org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.ConstraintVariable2 in project che by eclipse.
the class ParametricStructureComputer method updateParentContainerStructureFrom.
/**
* Updates the structure of the parent container variable of the given
* CollectionElementVariable2 from the structure of 'v1'.
* @param elemVar
* @param v1
*/
private void updateParentContainerStructureFrom(CollectionElementVariable2 elemVar, ConstraintVariable2 v1) {
ConstraintVariable2 elemContainer = elemVar.getParentConstraintVariable();
// This could be something that appears like it should have container
// structure, but doesn't, e.g., an array access for an array of containers
// (JDK 1.5 disallows arrays of parametric types). So if it doesn't have
// container structure, ignore it.
ParametricStructure elemContainerStructure = elemStructure(elemContainer);
if (elemContainerStructure == ParametricStructure.NONE)
return;
if (elemContainerStructure == null) {
// handle clone()
elemContainerStructure = newParametricType(elemContainer.getType());
setStructureAndPush(elemContainer, elemContainerStructure);
}
ParametricStructure v1Structure = elemStructure(v1);
//TODO: index is NOT_DECLARED_TYPE_VARIABLE_INDEX if the type variable comes from a supertype!!!
int parmIdx = elemVar.getDeclarationTypeVariableIndex();
if (parmIdx == CollectionElementVariable2.NOT_DECLARED_TYPE_VARIABLE_INDEX)
//TODO: ParametricStructure should use type variable keys instead of index
return;
if (elemContainerStructure == v1Structure || containsSubStructure(v1Structure, elemContainerStructure)) {
// avoid creating cyclic structure
if (!(elemStructure(elemVar) == ParametricStructure.NONE))
setStructureAndPush(elemVar, ParametricStructure.NONE);
if (elemContainerStructure.getParameters()[parmIdx] == null) {
elemContainerStructure.getParameters()[parmIdx] = ParametricStructure.NONE;
fWorkList2.push(elemContainer);
}
} else if (updateStructureOfIthParamFrom(elemContainerStructure, parmIdx, v1Structure)) {
setStructureAndPush(elemVar, elemContainerStructure.getParameters()[parmIdx]);
fWorkList2.push(elemContainer);
if (DEBUG_INITIALIZATION)
//$NON-NLS-1$ //$NON-NLS-2$
System.out.println(" updated structure of " + elemContainer + " to " + elemContainerStructure);
}
}
use of org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.ConstraintVariable2 in project che by eclipse.
the class InferTypeArgumentsConstraintCreator method endVisit.
@Override
public void endVisit(ReturnStatement node) {
Expression expression = node.getExpression();
if (expression == null)
return;
ConstraintVariable2 expressionCv = getConstraintVariable(expression);
if (expressionCv == null)
return;
MethodDeclaration methodDeclaration = (MethodDeclaration) ASTNodes.getParent(node, ASTNode.METHOD_DECLARATION);
if (methodDeclaration == null)
return;
IMethodBinding methodBinding = methodDeclaration.resolveBinding();
if (methodBinding == null)
return;
ReturnTypeVariable2 returnTypeCv = fTCModel.makeReturnTypeVariable(methodBinding);
if (returnTypeCv == null)
return;
fTCModel.createElementEqualsConstraints(returnTypeCv, expressionCv);
}
use of org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.ConstraintVariable2 in project che by eclipse.
the class InferTypeArgumentsConstraintCreator method endVisit.
@Override
public void endVisit(QualifiedName node) {
if (node.resolveBoxing()) {
ImmutableTypeVariable2 boxed = fTCModel.makeImmutableTypeVariable(node.resolveTypeBinding(), node);
setConstraintVariable(node, boxed);
return;
}
ConstraintVariable2 cv = getConstraintVariable(node.getName());
setConstraintVariable(node, cv);
}
Aggregations