use of com.github.javaparser.resolution.types.ResolvedReferenceType in project javaparser by javaparser.
the class ReflectionClassDeclarationTest method testGetAllAncestorsWithTypeParameters.
@Test
public void testGetAllAncestorsWithTypeParameters() {
ReflectionClassDeclaration constructorDeclaration = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
ResolvedReferenceType ancestor;
List<ResolvedReferenceType> ancestors = constructorDeclaration.getAllAncestors();
ancestors.sort(Comparator.comparing(ResolvedReferenceType::getQualifiedName));
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.HasParentNode", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.Node", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.HasParentNode.T").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.Node", ancestor.getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.body.BodyDeclaration", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.BodyDeclaration.T").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.body.CallableDeclaration", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.body.CallableDeclaration.T").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithAnnotations.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithDeclaration", ancestor.getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithModifiers", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithModifiers.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithRange", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.Node", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithRange.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTokenRange", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.Node", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTokenRange.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAbstractModifier", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAbstractModifier.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithProtectedModifier.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPublicModifier.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStaticModifier", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStaticModifier.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStrictfpModifier", ancestor.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", ancestor.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStrictfpModifier.N").get().asReferenceType().getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.observer.Observable", ancestor.getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.ast.visitor.Visitable", ancestor.getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("com.github.javaparser.resolution.Resolvable", ancestor.getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("java.lang.Cloneable", ancestor.getQualifiedName());
ancestor = ancestors.remove(0);
assertEquals("java.lang.Object", ancestor.getQualifiedName());
assertTrue(ancestors.isEmpty());
}
use of com.github.javaparser.resolution.types.ResolvedReferenceType in project javaparser by javaparser.
the class ReflectionClassDeclarationTest method testGetInterfacesWithParameters.
@Test
public void testGetInterfacesWithParameters() {
ReflectionClassDeclaration constructorDeclaration = (ReflectionClassDeclaration) typeResolver.solveType("com.github.javaparser.ast.body.ConstructorDeclaration");
System.out.println(constructorDeclaration.getInterfaces().stream().map(t -> t.getQualifiedName()).collect(Collectors.toList()));
assertEquals(8, constructorDeclaration.getInterfaces().size());
ResolvedReferenceType interfaze;
interfaze = constructorDeclaration.getInterfaces().get(0);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt", interfaze.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt.N").get().asReferenceType().getQualifiedName());
interfaze = constructorDeclaration.getInterfaces().get(1);
assertEquals("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers", interfaze.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.modifiers.NodeWithAccessModifiers.N").get().asReferenceType().getQualifiedName());
interfaze = constructorDeclaration.getInterfaces().get(2);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc", interfaze.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithJavadoc.N").get().asReferenceType().getQualifiedName());
interfaze = constructorDeclaration.getInterfaces().get(3);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName", interfaze.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithSimpleName.N").get().asReferenceType().getQualifiedName());
interfaze = constructorDeclaration.getInterfaces().get(4);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithParameters", interfaze.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithParameters.N").get().asReferenceType().getQualifiedName());
interfaze = constructorDeclaration.getInterfaces().get(5);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions", interfaze.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithThrownExceptions.N").get().asReferenceType().getQualifiedName());
interfaze = constructorDeclaration.getInterfaces().get(6);
assertEquals("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters", interfaze.getQualifiedName());
assertEquals("com.github.javaparser.ast.body.ConstructorDeclaration", interfaze.typeParametersMap().getValueBySignature("com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters.N").get().asReferenceType().getQualifiedName());
interfaze = constructorDeclaration.getInterfaces().get(7);
assertEquals("com.github.javaparser.resolution.Resolvable", interfaze.getQualifiedName());
}
use of com.github.javaparser.resolution.types.ResolvedReferenceType in project javaparser by javaparser.
the class Issue113 method issue113superClassIsResolvedCorrectly.
@Test
public void issue113superClassIsResolvedCorrectly() throws FileNotFoundException {
String pathToSourceFile = adaptPath("src/test/resources/issue113/com/foo/Widget.java");
CompilationUnit cu = JavaParser.parse(new File(pathToSourceFile));
JavaParserClassDeclaration jssExtendedWidget = new JavaParserClassDeclaration(cu.getClassByName("Widget").get(), typeSolver);
ResolvedReferenceType superClass = jssExtendedWidget.getSuperClass();
assertEquals("com.foo.base.Widget", superClass.getQualifiedName());
}
use of com.github.javaparser.resolution.types.ResolvedReferenceType in project javaparser by javaparser.
the class ReflectionMethodResolutionLogic method solveMethod.
static SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> parameterTypes, boolean staticOnly, TypeSolver typeSolver, ResolvedReferenceTypeDeclaration scopeType, Class clazz) {
List<ResolvedMethodDeclaration> methods = new ArrayList<>();
Predicate<Method> staticOnlyCheck = m -> !staticOnly || (staticOnly && Modifier.isStatic(m.getModifiers()));
for (Method method : clazz.getMethods()) {
if (method.isBridge() || method.isSynthetic() || !method.getName().equals(name) || !staticOnlyCheck.test(method))
continue;
ResolvedMethodDeclaration methodDeclaration = new ReflectionMethodDeclaration(method, typeSolver);
methods.add(methodDeclaration);
}
for (ResolvedReferenceType ancestor : scopeType.getAncestors()) {
SymbolReference<ResolvedMethodDeclaration> ref = MethodResolutionLogic.solveMethodInType(ancestor.getTypeDeclaration(), name, parameterTypes, staticOnly, typeSolver);
if (ref.isSolved()) {
methods.add(ref.getCorrespondingDeclaration());
}
}
if (scopeType.getAncestors().isEmpty()) {
ReferenceTypeImpl objectClass = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
SymbolReference<ResolvedMethodDeclaration> ref = MethodResolutionLogic.solveMethodInType(objectClass.getTypeDeclaration(), name, parameterTypes, staticOnly, typeSolver);
if (ref.isSolved()) {
methods.add(ref.getCorrespondingDeclaration());
}
}
return MethodResolutionLogic.findMostApplicable(methods, name, parameterTypes, typeSolver);
}
use of com.github.javaparser.resolution.types.ResolvedReferenceType in project javaparser by javaparser.
the class BoundSet method deriveImpliedBounds.
public BoundSet deriveImpliedBounds(TypeSolver typeSolver) {
// As bound sets are constructed and grown during inference, it is possible that new bounds can be inferred
// based on the assertions of the original bounds. The process of incorporation identifies these new bounds
// and adds them to the bound set.
//
// Incorporation can happen in two scenarios. One scenario is that the bound set contains complementary pairs
// of bounds; this implies new constraint formulas, as specified in §18.3.1. The other scenario is that the
// bound set contains a bound involving capture conversion; this implies new bounds and may imply new
// constraint formulas, as specified in §18.3.2. In both scenarios, any new constraint formulas are reduced,
// and any new bounds are added to the bound set. This may trigger further incorporation; ultimately, the set
// will reach a fixed point and no further bounds can be inferred.
//
// If incorporation of a bound set has reached a fixed point, and the set does not contain the bound false,
// then the bound set has the following properties:
//
// - For each combination of a proper lower bound L and a proper upper bound U of an inference variable, L <: U.
//
// - If every inference variable mentioned by a bound has an instantiation, the bound is satisfied by the
// corresponding substitution.
//
// - Given a dependency α = β, every bound of α matches a bound of β, and vice versa.
//
// - Given a dependency α <: β, every lower bound of α is a lower bound of β, and every upper bound of β is an
// upper bound of α.
ConstraintFormulaSet newConstraintsSet = ConstraintFormulaSet.empty();
// SECTION Complementary Pairs of Bounds
// (In this section, S and T are inference variables or types, and U is a proper type. For conciseness, a bound
// of the form α = T may also match a bound of the form T = α.)
//
// When a bound set contains a pair of bounds that match one of the following rules, a new constraint formula
// is implied:
//
// - α = S and α = T imply ‹S = T›
newConstraintsSet = forEachPairSameAs((a, b, currentConstraintSet) -> {
if (areSameTypeInference(a.getS(), b.getS())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(a.getT(), b.getT()));
}
if (areSameTypeInference(a.getS(), b.getT())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(a.getS(), b.getT()));
}
if (areSameTypeInference(a.getT(), b.getS())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(a.getT(), b.getS()));
}
if (areSameTypeInference(a.getT(), b.getT())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(a.getS(), b.getS()));
}
return currentConstraintSet;
}, newConstraintsSet);
// - α = S and α <: T imply ‹S <: T›
newConstraintsSet = forEachPairSameAndSubtype((a, b, currentConstraintSet) -> {
if (areSameTypeInference(a.getS(), b.getS())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSubtypeOfType(typeSolver, a.getT(), b.getT()));
}
if (areSameTypeInference(a.getT(), b.getS())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSubtypeOfType(typeSolver, a.getS(), b.getT()));
}
return currentConstraintSet;
}, newConstraintsSet);
// - α = S and T <: α imply ‹T <: S›
newConstraintsSet = forEachPairSameAndSubtype((a, b, currentConstraintSet) -> {
if (areSameTypeInference(a.getS(), b.getT())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSubtypeOfType(typeSolver, b.getS(), a.getT()));
}
if (areSameTypeInference(a.getT(), b.getT())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSubtypeOfType(typeSolver, b.getS(), a.getS()));
}
return currentConstraintSet;
}, newConstraintsSet);
// - S <: α and α <: T imply ‹S <: T›
newConstraintsSet = forEachPairSubtypeAndSubtype((a, b, currentConstraintSet) -> {
if (areSameTypeInference(a.getT(), b.getS())) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSubtypeOfType(typeSolver, b.getS(), a.getT()));
}
return currentConstraintSet;
}, newConstraintsSet);
// - α = U and S = T imply ‹S[α:=U] = T[α:=U]›
newConstraintsSet = forEachPairSameAs((a, b, currentConstraintSet) -> {
if (isInferenceVariable(a.getS()) && isProperType(a.getT())) {
InferenceVariable alpha = (InferenceVariable) a.getS();
ResolvedType U = a.getT();
ResolvedType S = b.getS();
ResolvedType T = b.getT();
Substitution sub = Substitution.empty().withPair(alpha.getTypeParameterDeclaration(), U);
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(sub.apply(S), sub.apply(T)));
}
if (isInferenceVariable(a.getT()) && isProperType(a.getS())) {
InferenceVariable alpha = (InferenceVariable) a.getT();
ResolvedType U = a.getS();
ResolvedType S = b.getS();
ResolvedType T = b.getT();
Substitution sub = Substitution.empty().withPair(alpha.getTypeParameterDeclaration(), U);
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(sub.apply(S), sub.apply(T)));
}
if (isInferenceVariable(b.getS()) && isProperType(b.getT())) {
InferenceVariable alpha = (InferenceVariable) b.getS();
ResolvedType U = b.getT();
ResolvedType S = a.getS();
ResolvedType T = a.getT();
Substitution sub = Substitution.empty().withPair(alpha.getTypeParameterDeclaration(), U);
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(sub.apply(S), sub.apply(T)));
}
if (isInferenceVariable(b.getT()) && isProperType(b.getS())) {
InferenceVariable alpha = (InferenceVariable) b.getT();
ResolvedType U = b.getS();
ResolvedType S = a.getS();
ResolvedType T = a.getT();
Substitution sub = Substitution.empty().withPair(alpha.getTypeParameterDeclaration(), U);
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(sub.apply(S), sub.apply(T)));
}
return currentConstraintSet;
}, newConstraintsSet);
// - α = U and S <: T imply ‹S[α:=U] <: T[α:=U]›
newConstraintsSet = forEachPairSameAndSubtype((a, b, currentConstraintSet) -> {
if (isInferenceVariable(a.getS()) && isProperType(a.getT())) {
InferenceVariable alpha = (InferenceVariable) a.getS();
ResolvedType U = a.getT();
ResolvedType S = b.getS();
ResolvedType T = b.getT();
Substitution sub = Substitution.empty().withPair(alpha.getTypeParameterDeclaration(), U);
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSubtypeOfType(typeSolver, sub.apply(S), sub.apply(T)));
}
if (isInferenceVariable(a.getT()) && isProperType(a.getS())) {
InferenceVariable alpha = (InferenceVariable) a.getT();
ResolvedType U = a.getS();
ResolvedType S = b.getS();
ResolvedType T = b.getT();
Substitution sub = Substitution.empty().withPair(alpha.getTypeParameterDeclaration(), U);
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSubtypeOfType(typeSolver, sub.apply(S), sub.apply(T)));
}
return currentConstraintSet;
}, newConstraintsSet);
// When a bound set contains a pair of bounds α <: S and α <: T, and there exists a supertype of S of the
// form G<S1, ..., Sn> and a supertype of T of the form G<T1, ..., Tn> (for some generic class or interface, G),
// then for all i (1 ≤ i ≤ n), if Si and Ti are types (not wildcards), the constraint formula ‹Si = Ti› is
// implied.
newConstraintsSet = forEachPairSubtypeAndSubtype((a, b, currentConstraintSet) -> {
if (isInferenceVariable(a.getS()) && isInferenceVariable(b.getS())) {
if (a.getT().isReferenceType() && b.getT().isReferenceType()) {
ResolvedReferenceType S = a.getT().asReferenceType();
ResolvedReferenceType T = b.getT().asReferenceType();
List<Pair<ResolvedReferenceType, ResolvedReferenceType>> pairs = findPairsOfCommonAncestors(S, T);
for (Pair<ResolvedReferenceType, ResolvedReferenceType> pair : pairs) {
for (int i = 0; i < Math.min(pair.a.typeParametersValues().size(), pair.b.typeParametersValues().size()); i++) {
ResolvedType si = pair.a.typeParametersValues().get(i);
ResolvedType ti = pair.b.typeParametersValues().get(i);
if (!si.isWildcard() && !ti.isWildcard()) {
currentConstraintSet = currentConstraintSet.withConstraint(new TypeSameAsType(si, ti));
}
}
}
}
}
return currentConstraintSet;
}, newConstraintsSet);
for (Bound b : this.bounds.stream().filter(b -> b instanceof CapturesBound).collect(Collectors.toList())) {
CapturesBound capturesBound = (CapturesBound) b;
throw new UnsupportedOperationException();
// Let P1, ..., Pn represent the type parameters of G and let B1, ..., Bn represent the bounds of these type
// parameters. Let θ represent the substitution [P1:=α1, ..., Pn:=αn]. Let R be a type that is not an inference
// variable (but is not necessarily a proper type).
//
// A set of bounds on α1, ..., αn is implied, constructed from the declared bounds of P1, ..., Pn as specified
// in §18.1.3.
//
// In addition, for all i (1 ≤ i ≤ n):
//
// - If Ai is not a wildcard, then the bound αi = Ai is implied.
//
// - If Ai is a wildcard of the form ?:
//
// - αi = R implies the bound false
//
// - αi <: R implies the constraint formula ‹Bi θ <: R›
//
// - R <: αi implies the bound false
//
// - If Ai is a wildcard of the form ? extends T:
//
// - αi = R implies the bound false
//
// - If Bi is Object, then αi <: R implies the constraint formula ‹T <: R›
//
// - If T is Object, then αi <: R implies the constraint formula ‹Bi θ <: R›
//
// - R <: αi implies the bound false
//
// - If Ai is a wildcard of the form ? super T:
//
// - αi = R implies the bound false
//
// - αi <: R implies the constraint formula ‹Bi θ <: R›
//
// - R <: αi implies the constraint formula ‹R <: T›
}
if (newConstraintsSet.isEmpty()) {
return this;
} else {
BoundSet newBounds = newConstraintsSet.reduce(typeSolver);
if (newBounds.isEmpty()) {
return this;
}
return this.incorporate(newBounds, typeSolver);
}
}
Aggregations