  Line 42) typeDeclaration.getTypeParameters().stream().map(tp -> new TypeVariable(tp)).collect(Collectors.toList()) ==> java.util.stream.Stream.collect(java.util.stream.Collector<? super T, A, R>)
  Line 42) typeDeclaration.getTypeParameters().stream().map(tp -> new TypeVariable(tp)) ==> java.util.stream.Stream.map(java.util.function.Function<? super T, ? extends R>)
  Line 42) typeDeclaration.getTypeParameters().stream() ==> java.util.Collection.stream()
  Line 42) typeDeclaration.getTypeParameters() ==> com.github.javaparser.symbolsolver.model.declarations.TypeParametrizable.getTypeParameters()
  Line 44) Collectors.toList() ==> java.util.stream.Collectors.toList()
  Line 69) javaParserTypeVariableDeclaration.asTypeParameter() ==> com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeVariableDeclaration.asTypeParameter()
  Line 71) this.typeDeclaration.getClass().getCanonicalName() ==> java.lang.Class.getCanonicalName()
  Line 71) this.typeDeclaration.getClass() ==> java.lang.Object.getClass()
  Line 80) this.isPrimitive() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.isPrimitive()
  Line 83) other.isVoid() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.isVoid()
  Line 83) this.getQualifiedName().equals(Object.class.getCanonicalName()) ==> java.lang.String.equals(java.lang.Object)
  Line 83) this.getQualifiedName() ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.getQualifiedName()
  Line 83) Object.class.getCanonicalName() ==> java.lang.Class.getCanonicalName()
  Line 87) other.isPrimitive() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.isPrimitive()
  Line 88) this.getQualifiedName().equals(Object.class.getCanonicalName()) ==> java.lang.String.equals(java.lang.Object)
  Line 88) this.getQualifiedName() ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.getQualifiedName()
  Line 88) Object.class.getCanonicalName() ==> java.lang.Class.getCanonicalName()
  Line 92) isCorrespondingBoxingType(other.describe()) ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.isCorrespondingBoxingType(java.lang.String)
  Line 92) other.describe() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.describe()
  Line 95) typeSolver.tryToSolveType(other.asPrimitive().getBoxTypeQName()) ==> com.github.javaparser.symbolsolver.model.resolution.TypeSolver.tryToSolveType(java.lang.String)
  Line 95) other.asPrimitive().getBoxTypeQName() ==> com.github.javaparser.symbolsolver.model.typesystem.PrimitiveType.getBoxTypeQName()
  Line 95) other.asPrimitive() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.asPrimitive()
  Line 96) type.getCorrespondingDeclaration().canBeAssignedTo(super.typeDeclaration) ==> com.github.javaparser.symbolsolver.model.declarations.ReferenceTypeDeclaration.canBeAssignedTo(com.github.javaparser.symbolsolver.model.declarations.ReferenceTypeDeclaration)
  Line 96) type.getCorrespondingDeclaration() ==> com.github.javaparser.symbolsolver.model.resolution.SymbolReference.getCorrespondingDeclaration()
  Line 100) this.getTypeDeclaration().hasAnnotation(FunctionalInterface.class.getCanonicalName()) ==> com.github.javaparser.symbolsolver.model.declarations.ReferenceTypeDeclaration.hasAnnotation(java.lang.String)
  Line 100) this.getTypeDeclaration() ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.getTypeDeclaration()
  Line 100) FunctionalInterface.class.getCanonicalName() ==> java.lang.Class.getCanonicalName()
  Line 103) compareConsideringTypeParameters(otherRef) ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.compareConsideringTypeParameters(com.github.javaparser.symbolsolver.model.typesystem.ReferenceType)
  Line 106) otherRef.getAllAncestors() ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.getAllAncestors()
  Line 107) compareConsideringTypeParameters(otherAncestor) ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.compareConsideringTypeParameters(com.github.javaparser.symbolsolver.model.typesystem.ReferenceType)
  Line 112) other.isTypeVariable() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.isTypeVariable()
  Line 113) other.asTypeVariable().asTypeParameter().getBounds(typeSolver) ==> com.github.javaparser.symbolsolver.model.declarations.TypeParameterDeclaration.getBounds(com.github.javaparser.symbolsolver.model.resolution.TypeSolver)
  Line 113) other.asTypeVariable().asTypeParameter() ==> com.github.javaparser.symbolsolver.model.typesystem.TypeVariable.asTypeParameter()
  Line 113) other.asTypeVariable() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.asTypeVariable()
  Line 114) bound.isExtends() ==> com.github.javaparser.symbolsolver.model.declarations.TypeParameterDeclaration.Bound.isExtends()
  Line 115) this.isAssignableBy(bound.getType()) ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl.isAssignableBy(com.github.javaparser.symbolsolver.model.typesystem.Type)
  Line 115) bound.getType() ==> com.github.javaparser.symbolsolver.model.declarations.TypeParameterDeclaration.Bound.getType()
  Line 121) other.isConstraint() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.isConstraint()
  Line 122) isAssignableBy(other.asConstraintType().getBound()) ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl.isAssignableBy(com.github.javaparser.symbolsolver.model.typesystem.Type)
  Line 122) other.asConstraintType().getBound() ==> com.github.javaparser.symbolsolver.model.typesystem.LambdaConstraintType.getBound()
  Line 122) other.asConstraintType() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.asConstraintType()
  Line 123) other.isWildcard() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.isWildcard()
  Line 124) this.getQualifiedName().equals(Object.class.getCanonicalName()) ==> java.lang.String.equals(java.lang.Object)
  Line 124) this.getQualifiedName() ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.getQualifiedName()
  Line 124) Object.class.getCanonicalName() ==> java.lang.Class.getCanonicalName()
  Line 126) other.asWildcard().isExtends() ==> com.github.javaparser.symbolsolver.model.typesystem.Wildcard.isExtends()
  Line 126) other.asWildcard() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.asWildcard()
  Line 127) isAssignableBy(other.asWildcard().getBoundedType()) ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl.isAssignableBy(com.github.javaparser.symbolsolver.model.typesystem.Type)
  Line 127) other.asWildcard().getBoundedType() ==> com.github.javaparser.symbolsolver.model.typesystem.Wildcard.getBoundedType()
  Line 127) other.asWildcard() ==> com.github.javaparser.symbolsolver.model.typesystem.Type.asWildcard()
  Line 140) getTypeDeclaration().getDeclaredMethods() ==> com.github.javaparser.symbolsolver.model.declarations.ReferenceTypeDeclaration.getDeclaredMethods()
  Line 140) getTypeDeclaration() ==> com.github.javaparser.symbolsolver.model.typesystem.ReferenceType.getTypeDeclaration()
  Line 142) methods.add(methodUsage) ==> java.util.Set.add(E)
