  Line 56) Collections.emptySet() ==> java.util.Collections.emptySet()
  Line 60) getContext().solveMethod(name, parameterTypes, false, typeSolver) ==> com.github.javaparser.symbolsolver.core.resolution.Context.solveMethod(java.lang.String, java.util.List<com.github.javaparser.symbolsolver.model.typesystem.Type>, boolean, com.github.javaparser.symbolsolver.model.resolution.TypeSolver)
  Line 60) getContext() ==> com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter.getContext()
  Line 70) wrappedNode.equals(that.wrappedNode) ==> com.github.javaparser.ast.Node.equals(java.lang.Object)
  Line 77) wrappedNode.hashCode() ==> com.github.javaparser.ast.Node.hashCode()
  Line 78) typeSolver.hashCode() ==> java.lang.Object.hashCode()
  Line 84) wrappedNode.getName().getId() ==> com.github.javaparser.ast.nodeTypes.NodeWithIdentifier.getId()
  Line 84) wrappedNode.getName() ==> com.github.javaparser.ast.type.TypeParameter.getName()
  Line 89) isAssignableBy(new ReferenceTypeImpl(other, typeSolver)) ==> com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter.isAssignableBy(com.github.javaparser.symbolsolver.model.typesystem.Type)
  Line 94) getContainer() ==> com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter.getContainer()
  Line 96) ((ReferenceTypeDeclaration) container).getQualifiedName() ==> com.github.javaparser.symbolsolver.model.declarations.TypeDeclaration.getQualifiedName()
  Line 98) ((JavaParserConstructorDeclaration) container).getQualifiedSignature() ==> com.github.javaparser.symbolsolver.model.declarations.MethodLikeDeclaration.getQualifiedSignature()
  Line 100) ((JavaParserMethodDeclaration) container).getQualifiedSignature() ==> com.github.javaparser.symbolsolver.model.declarations.MethodLikeDeclaration.getQualifiedSignature()
  Line 106) getContainer() ==> com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter.getContainer()
  Line 108) ((ReferenceTypeDeclaration) container).getId() ==> com.github.javaparser.symbolsolver.model.declarations.TypeDeclaration.getId()
  Line 110) ((JavaParserConstructorDeclaration) container).getQualifiedSignature() ==> com.github.javaparser.symbolsolver.model.declarations.MethodLikeDeclaration.getQualifiedSignature()
  Line 112) ((JavaParserMethodDeclaration) container).getQualifiedSignature() ==> com.github.javaparser.symbolsolver.model.declarations.MethodLikeDeclaration.getQualifiedSignature()
  Line 118) getParentNode(wrappedNode) ==> com.github.javaparser.symbolsolver.javaparser.Navigator.getParentNode(com.github.javaparser.ast.Node)
  Line 121) JavaParserFacade.get(typeSolver).getTypeDeclaration(jpTypeDeclaration) ==> com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getTypeDeclaration(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration)
  Line 121) JavaParserFacade.get(typeSolver) ==> com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.get(com.github.javaparser.symbolsolver.model.resolution.TypeSolver)
  Line 124) jpConstructorDeclaration.getAncestorOfType(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration.class) ==> com.github.javaparser.HasParentNode.getAncestorOfType(java.lang.Class<N>)
  Line 125) jpTypeDeclaration.isPresent() ==> java.util.Optional.isPresent()
  Line 126) JavaParserFacade.get(typeSolver).getTypeDeclaration(jpTypeDeclaration.get()) ==> com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getTypeDeclaration(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration)
  Line 126) JavaParserFacade.get(typeSolver) ==> com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.get(com.github.javaparser.symbolsolver.model.resolution.TypeSolver)
  Line 126) jpTypeDeclaration.get() ==> java.util.Optional.get()
  Line 127) typeDeclaration.isClass() ==> com.github.javaparser.symbolsolver.model.declarations.TypeDeclaration.isClass()
  Line 128) typeDeclaration.asClass() ==> com.github.javaparser.symbolsolver.model.declarations.TypeDeclaration.asClass()
  Line 140) String.format("%s.%s", getContainerQualifiedName(), getName()) ==> java.lang.String.format(java.lang.String, java.lang.Object...)
  Line 140) getContainerQualifiedName() ==> com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter.getContainerQualifiedName()
  Line 140) getName() ==> com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter.getName()
  Line 145) wrappedNode.getTypeBound().stream().map((astB) -> toBound(astB, typeSolver)).collect(Collectors.toList()) ==> ERROR
  Line 145) wrappedNode.getTypeBound().stream().map((astB) -> toBound(astB, typeSolver)) ==> ERROR
  Line 145) wrappedNode.getTypeBound().stream() ==> java.util.Collection.stream()
  Line 145) wrappedNode.getTypeBound() ==> com.github.javaparser.ast.type.TypeParameter.getTypeBound()
  Line 145) toBound(astB, typeSolver) ==> ERROR
  Line 145) Collectors.toList() ==> java.util.stream.Collectors.toList()
  Line 149) JavaParserFacade.get(typeSolver).convertToUsage(classOrInterfaceType, classOrInterfaceType) ==> com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsage(com.github.javaparser.ast.type.Type, com.github.javaparser.ast.Node)
  Line 149) JavaParserFacade.get(typeSolver) ==> com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.get(com.github.javaparser.symbolsolver.model.resolution.TypeSolver)
  Line 150) Bound.extendsBound(type) ==> com.github.javaparser.symbolsolver.model.declarations.TypeParameterDeclaration.Bound.extendsBound(com.github.javaparser.symbolsolver.model.typesystem.Type)
  Line 199) Collections.emptyList() ==> java.util.Collections.emptyList()
  Line 213) wrappedNode.getName() ==> com.github.javaparser.ast.type.TypeParameter.getName()
  Line 213) wrappedNode.getTypeBound() ==> com.github.javaparser.ast.type.TypeParameter.getTypeBound()
  Line 218) getContainer() ==> com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter.getContainer()
  Line 220) Optional.of((ReferenceTypeDeclaration) container) ==> java.util.Optional.of(T)
  Line 222) Optional.empty() ==> java.util.Optional.empty()
