Changed GatherNames to add types declared inside of other types to the JavaClassRegistry
This commit is contained in:
parent
492cbe48e9
commit
939d402b1e
@ -1,4 +1,5 @@
|
||||
import java.lang.Integer;
|
||||
import java.lang.Boolean;
|
||||
import java.lang.String;
|
||||
import java.lang.Object;
|
||||
|
||||
|
@ -199,11 +199,7 @@ interfaceMemberDeclaration
|
||||
: constDeclaration # interfaceconst
|
||||
| interfaceMethodDeclaration # interfacemethod
|
||||
| genericInterfaceMethodDeclaration # genericinterfacemethod
|
||||
| interfaceDeclaration # subinterface
|
||||
| annotationTypeDeclaration # interfaceannotationtype
|
||||
| classDeclaration # interfaceclass
|
||||
| enumDeclaration # interfaceenum
|
||||
| recordDeclaration # interfacerecord // Java17
|
||||
| classOrInterface # subclassorinterface
|
||||
;
|
||||
|
||||
constDeclaration
|
||||
@ -391,11 +387,7 @@ annotationTypeElementDeclaration
|
||||
|
||||
annotationTypeElementRest
|
||||
: typeType annotationMethodOrConstantRest ';'
|
||||
| classDeclaration ';'?
|
||||
| interfaceDeclaration ';'?
|
||||
| enumDeclaration ';'?
|
||||
| annotationTypeDeclaration ';'?
|
||||
| recordDeclaration ';'? // Java17
|
||||
| classOrInterface ';'?
|
||||
;
|
||||
|
||||
annotationMethodOrConstantRest
|
||||
|
@ -1,28 +1,46 @@
|
||||
package de.dhbwstuttgart.parser.scope;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.antlr.v4.runtime.ParserRuleContext;
|
||||
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.ClassDeclarationContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.ClassorinterfacedeclContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.NoclassorinterfaceContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.SrcfileContext;
|
||||
import de.dhbwstuttgart.environment.PackageCrawler;
|
||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.AnnotationTypeElementDeclarationContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.ClassBodyContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.ClassBodyDeclarationContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.ClassOrInterfaceContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.ClassorinterfacedeclContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.EnumConstantContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.EnumConstantsContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.InterfaceBodyDeclarationContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.InterfacememberContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.MemberclassorinterfaceContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.MemberdeclContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.NoclassorinterfaceContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.SrcfileContext;
|
||||
import de.dhbwstuttgart.parser.antlr.Java17Parser.SubclassorinterfaceContext;
|
||||
|
||||
public class GatherNames {
|
||||
|
||||
public static Map<String, Integer> getNames(SrcfileContext ctx, PackageCrawler packages, ClassLoader classLoader) throws ClassNotFoundException {
|
||||
Map<String, Integer> ret = new HashMap<>();
|
||||
String pkgName = getPackageName(ctx);
|
||||
String nameString = "";
|
||||
for (Java17Parser.ClassOrInterfaceContext member : ctx.classOrInterface()) {
|
||||
if (member instanceof NoclassorinterfaceContext) {
|
||||
for (Java17Parser.ClassOrInterfaceContext clsoifctx : ctx.classOrInterface()) {
|
||||
if (clsoifctx instanceof NoclassorinterfaceContext) {
|
||||
continue;
|
||||
}
|
||||
ClassorinterfacedeclContext clsoif = (ClassorinterfacedeclContext) member;
|
||||
ret.putAll(getNames(clsoifctx, getPackageName(ctx), packages, classLoader));
|
||||
}
|
||||
ret.putAll(getImports(ctx, packages, classLoader));
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static Map<String, Integer> getNames(ClassOrInterfaceContext clsoifctx, String pkgName, PackageCrawler packages, ClassLoader classLoader) throws ClassNotFoundException {
|
||||
Map<String, Integer> ret = new HashMap<>();
|
||||
ClassorinterfacedeclContext clsoif = (ClassorinterfacedeclContext) clsoifctx;
|
||||
String nameString = "";
|
||||
String fullname = clsoif.getChild(clsoif.getChildCount() - 1).getClass().getName();
|
||||
String classname = fullname.substring(fullname.indexOf("$") + 1);
|
||||
int numGenerics = 0;
|
||||
@ -38,6 +56,7 @@ public class GatherNames {
|
||||
}
|
||||
numGenerics = clsoif.classDeclaration().genericDeclarationList() != null ? clsoif.classDeclaration().genericDeclarationList().genericTypeVar().size() : 0;
|
||||
ret.put(nameString, numGenerics);
|
||||
ret.putAll(getNames(clsoif.classDeclaration().classBody().classBodyDeclaration(), pkgName, packages, classLoader));
|
||||
break;
|
||||
case "EnumDeclarationContext":
|
||||
if (!pkgName.isEmpty()) {
|
||||
@ -47,6 +66,15 @@ public class GatherNames {
|
||||
}
|
||||
numGenerics = 0;
|
||||
ret.put(nameString, numGenerics);
|
||||
EnumConstantsContext enumConstants = clsoif.enumDeclaration().enumConstants();
|
||||
if (!Objects.isNull(enumConstants)) {
|
||||
for (EnumConstantContext enumConstant : enumConstants.enumConstant()) {
|
||||
ClassBodyContext enumConstClassBody = enumConstant.classBody();
|
||||
if (!Objects.isNull(enumConstClassBody)) {
|
||||
ret.putAll(getNames(enumConstClassBody.classBodyDeclaration(), pkgName, packages, classLoader));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "InterfaceDeclarationContext":
|
||||
if (pkgName != "") {
|
||||
@ -56,6 +84,11 @@ public class GatherNames {
|
||||
}
|
||||
numGenerics = clsoif.interfaceDeclaration().genericDeclarationList() != null ? clsoif.interfaceDeclaration().genericDeclarationList().genericTypeVar().size() : 0;
|
||||
ret.put(nameString, numGenerics);
|
||||
for (InterfaceBodyDeclarationContext ifbody : clsoif.interfaceDeclaration().interfaceBody().interfaceBodyDeclaration()) {
|
||||
if (ifbody instanceof InterfacememberContext member && member.interfaceMemberDeclaration() instanceof SubclassorinterfaceContext sub) {
|
||||
ret.putAll(getNames(sub.classOrInterface(), pkgName, packages, classLoader));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "AnnotationTypeDeclarationContext":
|
||||
if (pkgName != "") {
|
||||
@ -65,6 +98,12 @@ public class GatherNames {
|
||||
}
|
||||
numGenerics = 0;
|
||||
ret.put(nameString, numGenerics);
|
||||
for (AnnotationTypeElementDeclarationContext anTypeElem : clsoif.annotationTypeDeclaration().annotationTypeBody().annotationTypeElementDeclaration()) {
|
||||
ClassOrInterfaceContext anClsoifctx = anTypeElem.annotationTypeElementRest().classOrInterface();
|
||||
if (!Objects.isNull(anClsoifctx)) {
|
||||
ret.putAll(getNames(anClsoifctx, pkgName, packages, classLoader));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "RecordDeclarationContext":
|
||||
if (pkgName != "") {
|
||||
@ -74,12 +113,21 @@ public class GatherNames {
|
||||
}
|
||||
numGenerics = clsoif.recordDeclaration().genericDeclarationList() != null ? clsoif.recordDeclaration().genericDeclarationList().genericTypeVar().size() : 0;
|
||||
ret.put(nameString, numGenerics);
|
||||
ret.putAll(getNames(clsoif.recordDeclaration().recordBody().classBodyDeclaration(), pkgName, packages, classLoader));
|
||||
break;
|
||||
default:
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static Map<String, Integer> getNames(List<ClassBodyDeclarationContext> clsBodyDecl, String pkgName, PackageCrawler packages, ClassLoader classLoader) throws ClassNotFoundException {
|
||||
Map<String, Integer> ret = new HashMap<>();
|
||||
for (ClassBodyDeclarationContext clsbody : clsBodyDecl) {
|
||||
if (clsbody instanceof MemberdeclContext member && member.memberDeclaration() instanceof MemberclassorinterfaceContext memberclsoifctx) {
|
||||
ret.putAll(getNames(memberclsoifctx.classOrInterface(), pkgName, packages, classLoader));
|
||||
}
|
||||
}
|
||||
ret.putAll(getImports(ctx, packages, classLoader));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user