Skip to content

Commit

Permalink
add TypeParametersLogic
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Oct 22, 2016
1 parent 5dce72a commit 536d89f
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 100 deletions.
Expand Up @@ -22,12 +22,11 @@
import com.github.javaparser.symbolsolver.core.resolution.Context; import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.logic.TypeParametersLogic;
import com.github.javaparser.symbolsolver.model.declarations.*; import com.github.javaparser.symbolsolver.model.declarations.*;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.usages.MethodUsage; import com.github.javaparser.symbolsolver.model.usages.MethodUsage;
import com.github.javaparser.symbolsolver.model.usages.typesystem.ReferenceType;
import com.github.javaparser.symbolsolver.model.usages.typesystem.Type; import com.github.javaparser.symbolsolver.model.usages.typesystem.Type;
import com.github.javaparser.symbolsolver.model.usages.typesystem.Wildcard;


import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
Expand Down Expand Up @@ -104,7 +103,7 @@ public MethodUsage resolveTypeVariables(Context context, List<Type> parameterTyp
for (int i = 0; i < getNumberOfParams(); i++) { for (int i = 0; i < getNumberOfParams(); i++) {
Type formalParamType = getParam(i).getType(); Type formalParamType = getParam(i).getType();
Type actualParamType = parameterTypes.get(i); Type actualParamType = parameterTypes.get(i);
determineTypeParameters(determinedTypeParameters, formalParamType, actualParamType, typeSolver); TypeParametersLogic.determineTypeParameters(determinedTypeParameters, formalParamType, actualParamType, typeSolver);
} }


for (TypeParameterDeclaration determinedParam : determinedTypeParameters.keySet()) { for (TypeParameterDeclaration determinedParam : determinedTypeParameters.keySet()) {
Expand All @@ -114,53 +113,6 @@ public MethodUsage resolveTypeVariables(Context context, List<Type> parameterTyp
return new MethodUsage(new JavaParserMethodDeclaration(wrappedNode, typeSolver), params, returnType); return new MethodUsage(new JavaParserMethodDeclaration(wrappedNode, typeSolver), params, returnType);
} }


private void determineTypeParameters(Map<TypeParameterDeclaration, Type> determinedTypeParameters, Type formalParamType, Type actualParamType, TypeSolver typeSolver) {
if (actualParamType.isNull()) {
return;
}
if (actualParamType.isTypeVariable()) {
return;
}
if (formalParamType.isTypeVariable()) {
determinedTypeParameters.put(formalParamType.asTypeParameter(), actualParamType);
return;
}
if (formalParamType instanceof Wildcard) {
return;
}
if (formalParamType.isArray() && actualParamType.isArray()) {
determineTypeParameters(
determinedTypeParameters,
formalParamType.asArrayType().getComponentType(),
actualParamType.asArrayType().getComponentType(),
typeSolver);
return;
}
if (formalParamType.isReferenceType() && actualParamType.isReferenceType()
&& !formalParamType.asReferenceType().getQualifiedName().equals(actualParamType.asReferenceType().getQualifiedName())) {
List<ReferenceType> ancestors = actualParamType.asReferenceType().getAllAncestors();
final String formalParamTypeQName = formalParamType.asReferenceType().getQualifiedName();
List<Type> correspondingFormalType = ancestors.stream().filter((a) -> a.getQualifiedName().equals(formalParamTypeQName)).collect(Collectors.toList());
if (correspondingFormalType.isEmpty()) {
throw new IllegalArgumentException();
}
actualParamType = correspondingFormalType.get(0);
}
if (formalParamType.isReferenceType() && actualParamType.isReferenceType()) {
if (formalParamType.asReferenceType().isRawType() || actualParamType.asReferenceType().isRawType()) {
return;
}
List<Type> formalTypeParams = formalParamType.asReferenceType().typeParametersValues();
List<Type> actualTypeParams = actualParamType.asReferenceType().typeParametersValues();
if (formalTypeParams.size() != actualTypeParams.size()) {
throw new UnsupportedOperationException();
}
for (int i = 0; i < formalTypeParams.size(); i++) {
determineTypeParameters(determinedTypeParameters, formalTypeParams.get(i), actualTypeParams.get(i), typeSolver);
}
}
}

private Context getContext() { private Context getContext() {
return JavaParserFactory.getContext(wrappedNode, typeSolver); return JavaParserFactory.getContext(wrappedNode, typeSolver);
} }
Expand Down
Expand Up @@ -18,12 +18,11 @@


import com.github.javaparser.ast.Node; import com.github.javaparser.ast.Node;
import com.github.javaparser.symbolsolver.core.resolution.Context; import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.logic.TypeParametersLogic;
import com.github.javaparser.symbolsolver.model.declarations.*; import com.github.javaparser.symbolsolver.model.declarations.*;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.usages.MethodUsage; import com.github.javaparser.symbolsolver.model.usages.MethodUsage;
import com.github.javaparser.symbolsolver.model.usages.typesystem.ReferenceType;
import com.github.javaparser.symbolsolver.model.usages.typesystem.Type; import com.github.javaparser.symbolsolver.model.usages.typesystem.Type;
import com.github.javaparser.symbolsolver.model.usages.typesystem.Wildcard;


import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
Expand Down Expand Up @@ -126,7 +125,7 @@ public MethodUsage resolveTypeVariables(Context context, List<Type> parameterTyp
for (int i = 0; i < getNumberOfParams(); i++) { for (int i = 0; i < getNumberOfParams(); i++) {
Type formalParamType = getParam(i).getType(); Type formalParamType = getParam(i).getType();
Type actualParamType = parameterTypes.get(i); Type actualParamType = parameterTypes.get(i);
determineTypeParameters(determinedTypeParameters, formalParamType, actualParamType, typeSolver); TypeParametersLogic.determineTypeParameters(determinedTypeParameters, formalParamType, actualParamType, typeSolver);
} }


for (TypeParameterDeclaration determinedParam : determinedTypeParameters.keySet()) { for (TypeParameterDeclaration determinedParam : determinedTypeParameters.keySet()) {
Expand All @@ -136,53 +135,6 @@ public MethodUsage resolveTypeVariables(Context context, List<Type> parameterTyp
return new MethodUsage(new ReflectionMethodDeclaration(method, typeSolver), params, returnType); return new MethodUsage(new ReflectionMethodDeclaration(method, typeSolver), params, returnType);
} }


private void determineTypeParameters(Map<TypeParameterDeclaration, Type> determinedTypeParameters, Type formalParamType, Type actualParamType, TypeSolver typeSolver) {
if (actualParamType.isNull()) {
return;
}
if (actualParamType.isTypeVariable()) {
return;
}
if (formalParamType.isTypeVariable()) {
determinedTypeParameters.put(formalParamType.asTypeParameter(), actualParamType);
return;
}
if (formalParamType instanceof Wildcard) {
return;
}
if (formalParamType.isArray() && actualParamType.isArray()) {
determineTypeParameters(
determinedTypeParameters,
formalParamType.asArrayType().getComponentType(),
actualParamType.asArrayType().getComponentType(),
typeSolver);
return;
}
if (formalParamType.isReferenceType() && actualParamType.isReferenceType()
&& !formalParamType.asReferenceType().getQualifiedName().equals(actualParamType.asReferenceType().getQualifiedName())) {
List<ReferenceType> ancestors = actualParamType.asReferenceType().getAllAncestors();
final String formalParamTypeQName = formalParamType.asReferenceType().getQualifiedName();
List<Type> correspondingFormalType = ancestors.stream().filter((a) -> a.getQualifiedName().equals(formalParamTypeQName)).collect(Collectors.toList());
if (correspondingFormalType.isEmpty()) {
throw new IllegalArgumentException();
}
actualParamType = correspondingFormalType.get(0);
}
if (formalParamType.isReferenceType() && actualParamType.isReferenceType()) {
if (formalParamType.asReferenceType().isRawType() || actualParamType.asReferenceType().isRawType()) {
return;
}
List<Type> formalTypeParams = formalParamType.asReferenceType().typeParametersValues();
List<Type> actualTypeParams = actualParamType.asReferenceType().typeParametersValues();
if (formalTypeParams.size() != actualTypeParams.size()) {
throw new UnsupportedOperationException();
}
for (int i = 0; i < formalTypeParams.size(); i++) {
determineTypeParameters(determinedTypeParameters, formalTypeParams.get(i), actualTypeParams.get(i), typeSolver);
}
}
}

private Optional<Type> typeParamByName(String name, TypeSolver typeSolver, Context context) { private Optional<Type> typeParamByName(String name, TypeSolver typeSolver, Context context) {
int i = 0; int i = 0;
if (this.getTypeParameters() != null) { if (this.getTypeParameters() != null) {
Expand Down
@@ -0,0 +1,84 @@
/*
* Copyright 2016 Federico Tomassetti
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.github.javaparser.symbolsolver.logic;

import com.github.javaparser.symbolsolver.model.declarations.TypeParameterDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.usages.typesystem.ReferenceType;
import com.github.javaparser.symbolsolver.model.usages.typesystem.Type;
import com.github.javaparser.symbolsolver.model.usages.typesystem.Wildcard;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
* @author Federico Tomassetti
*/
public class TypeParametersLogic {

private TypeParametersLogic() {
// prevent instantiation
}

public static void determineTypeParameters(Map<TypeParameterDeclaration, Type> determinedTypeParameters, Type formalParamType, Type actualParamType, TypeSolver typeSolver) {
if (actualParamType.isNull()) {
return;
}
if (actualParamType.isTypeVariable()) {
return;
}
if (formalParamType.isTypeVariable()) {
determinedTypeParameters.put(formalParamType.asTypeParameter(), actualParamType);
return;
}
if (formalParamType instanceof Wildcard) {
return;
}
if (formalParamType.isArray() && actualParamType.isArray()) {
determineTypeParameters(
determinedTypeParameters,
formalParamType.asArrayType().getComponentType(),
actualParamType.asArrayType().getComponentType(),
typeSolver);
return;
}
if (formalParamType.isReferenceType() && actualParamType.isReferenceType()
&& !formalParamType.asReferenceType().getQualifiedName().equals(actualParamType.asReferenceType().getQualifiedName())) {
List<ReferenceType> ancestors = actualParamType.asReferenceType().getAllAncestors();
final String formalParamTypeQName = formalParamType.asReferenceType().getQualifiedName();
List<Type> correspondingFormalType = ancestors.stream().filter((a) -> a.getQualifiedName().equals(formalParamTypeQName)).collect(Collectors.toList());
if (correspondingFormalType.isEmpty()) {
throw new IllegalArgumentException();
}
actualParamType = correspondingFormalType.get(0);
}
if (formalParamType.isReferenceType() && actualParamType.isReferenceType()) {
if (formalParamType.asReferenceType().isRawType() || actualParamType.asReferenceType().isRawType()) {
return;
}
List<Type> formalTypeParams = formalParamType.asReferenceType().typeParametersValues();
List<Type> actualTypeParams = actualParamType.asReferenceType().typeParametersValues();
if (formalTypeParams.size() != actualTypeParams.size()) {
throw new UnsupportedOperationException();
}
for (int i = 0; i < formalTypeParams.size(); i++) {
determineTypeParameters(determinedTypeParameters, formalTypeParams.get(i), actualTypeParams.get(i), typeSolver);
}
}
}
}

0 comments on commit 536d89f

Please sign in to comment.