diff --git a/PeerAtCodeParser.jar b/PeerAtCodeParser.jar index be2cb50..c7144e0 100644 Binary files a/PeerAtCodeParser.jar and b/PeerAtCodeParser.jar differ diff --git a/src/dev/peerat/mapping/TreasureProcessor.java b/src/dev/peerat/mapping/TreasureProcessor.java index 68ad0a2..d58bcf4 100644 --- a/src/dev/peerat/mapping/TreasureProcessor.java +++ b/src/dev/peerat/mapping/TreasureProcessor.java @@ -1,5 +1,8 @@ package dev.peerat.mapping; +import static dev.peerat.parser.visitor.Operator.*; +import static dev.peerat.parser.java.visitor.JavaVisitor.*; + import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; @@ -24,7 +27,6 @@ import javax.tools.StandardLocation; import dev.peerat.mapping.providers.Provider; import dev.peerat.mapping.providers.ProviderManager; -import dev.peerat.parser.ElementBuilder.Builder; import dev.peerat.parser.Parser; import dev.peerat.parser.TokenValidator; import dev.peerat.parser.java.Annotation; @@ -33,11 +35,10 @@ import dev.peerat.parser.java.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaFile; import dev.peerat.parser.java.JavaParser; +import dev.peerat.parser.java.JavaProject; import dev.peerat.parser.java.operation.ReturnOperation; import dev.peerat.parser.java.value.InstanceValue; import dev.peerat.parser.java.value.StaticValue; -import dev.peerat.parser.java.visitor.JavaVisitor; -import dev.peerat.parser.visitor.Operator; public class TreasureProcessor extends AbstractProcessor{ @@ -69,64 +70,72 @@ public class TreasureProcessor extends AbstractProcessor{ return false; } - Map map = new HashMap<>(); + JavaProject project = new JavaProject(); for(File workingDirectory : workingDir){ try { - parseClazz(workingDirectory, output, workingDirectory, map); + parseProject(workingDirectory, project); }catch(Exception ex){ annotations.forEach((a) -> roundEnv.getElementsAnnotatedWith(a).forEach((e) -> processingEnv.getMessager().printMessage(Kind.ERROR, ex.getMessage(), e))); } } - Provider provider = null; - for(Entry classes : map.entrySet()){ - List ships = Operator.or( - JavaVisitor.allValue() //check if value is instance value for dev.peerat.mapping.Ship + + List ships = or( + collect(allInstanceValue().named((name) -> name.equals("dev.peerat.mapping.Ship"))) + , + and( + allImport().named((name) -> name.equals("dev.peerat.mapping.Ship")) , - JavaVisitor.allImport() //check if import for dev.peerat.mapping.Ship AND THEN instance value for dev.peerat.mapping.Ship OR Ship. - ).visit(classes.getValue()).toList(); - if(ships.isEmpty()) continue; + collect(allInstanceValue().named((name) -> name.equals("Ship"))) + ) + ).visit(project).toList(); + if(ships.isEmpty()) return false; - //TODO accept multiple instance of Ship - - InstanceValue ship = (InstanceValue)ships.get(0); - String providerType = ((StaticValue)ship.getParameters().get(0)).getToken().getValue().replace("\"", ""); - provider = ProviderManager.getInstance().getProvider(providerType); - } + //TODO accept multiple instance of Ship + + InstanceValue ship = (InstanceValue)ships.get(0); + String providerType = ((StaticValue)ship.getParameters().get(0)).getToken().getValue().replace("\"", ""); + Provider provider = ProviderManager.getInstance().getProvider(providerType); if(provider == null) return false; try { provider.init(output); - throw new Exception(output.getAbsolutePath()); } catch (Exception e) { throw new RuntimeException(e); } -// for(Entry classes : map.entrySet()){ -// Class treasure = classes.getValue().find((element) -> { -// if(element instanceof Class){ -// Class c = (Class)element; -// return c.hasAnnotation((annotation) -> annotation.getName().getValue().equals("Treasure")); //can also be dev.peerat.mapping.Treasure -// } -// return false; -// }); -// if(treasure != null){ -// provider.mapTreasure(treasure); -//// annotations.forEach((a) -> roundEnv.getElementsAnnotatedWith(a).forEach((e) -> processingEnv.getMessager().printMessage(Kind.ERROR, classes.getKey().getName(), e))); -// List seaBottles = new ArrayList<>(); -// treasure.findAll((element) -> { -// if(element instanceof Function){ -// Function function = (Function)element; -// return function.hasAnnotation((annotation) -> annotation.getName().getValue().equals("SeaBottle")); //can also be dev.peerat.mapping.SeaBottle -// } -// return false; -// }, seaBottles); -// for(Function function : seaBottles){ -// provider.mapBottle(treasure, function); -// } -// } -// } -// + List treasures = or( + and( + allImport().named((name) -> name.equals("dev.peerat.mapping.Treasure")) + , + allClass(). + annotation( + annotation().nameFilter((name) -> name.equals("Treasure") || name.equals("dev.peerat.mapping.Treasure")) + ) + ) + , + allClass(). + annotation( + annotation().nameFilter((name) -> name.equals("dev.peerat.mapping.Treasure")) + ) + ).visit(project).toList(); + + for(Class treasure : treasures){ + provider.mapTreasure(treasure); +// annotations.forEach((a) -> roundEnv.getElementsAnnotatedWith(a).forEach((e) -> processingEnv.getMessager().printMessage(Kind.ERROR, classes.getKey().getName(), e))); + List seaBottles = new ArrayList<>(); + treasure.findAll((element) -> { + if(element instanceof Function){ + Function function = (Function)element; + return function.hasAnnotation((annotation) -> annotation.getName().getValue().equals("SeaBottle")); //can also be dev.peerat.mapping.SeaBottle + } + return false; + }, seaBottles); + for(Function function : seaBottles){ + provider.mapBottle(treasure, function); + } + } + // for(Entry classes : map.entrySet()){ // List noTreasures = new ArrayList<>(); // classes.getValue().findAll((element) -> { @@ -150,12 +159,30 @@ public class TreasureProcessor extends AbstractProcessor{ // } // } // } -// provider.complete(); -// return true; + provider.complete(); + return true; } private static final Parser PARSER = new JavaParser(); + private void parseProject(File file, JavaProject project) throws Exception{ + if(file.isDirectory()){ + for(File child : file.listFiles()) parseProject(child, project); + return; + } + if(!file.getName().endsWith(".java")) return; + try { + BufferedReader reader = new BufferedReader(new FileReader(file)); + JavaFile javaFile = new JavaFile(); + TokenValidator.TOKENS = 0; + TokenValidator.MAX_VALIDATE = 0; + PARSER.parse(reader, javaFile); + project.addFile(javaFile); + }catch(Exception ex){ + error(null, null, file, new Exception(file.getName()+" | "+ex.getMessage())); + } + } + private void parseClazz(File source, File output, File file, Map map) throws Exception{ if(file.isDirectory()){ for(File child : file.listFiles()) parseClazz(source, output, child, map); @@ -203,9 +230,9 @@ public class TreasureProcessor extends AbstractProcessor{ }else{ processOthers(file); } - Builder builder = new Builder(); - file.build(builder); - builder.build(writer); +// Builder builder = new Builder(); +// file.build(builder); +// builder.build(writer); } diff --git a/src/dev/peerat/mapping/providers/Provider.java b/src/dev/peerat/mapping/providers/Provider.java index 51b36da..e981465 100644 --- a/src/dev/peerat/mapping/providers/Provider.java +++ b/src/dev/peerat/mapping/providers/Provider.java @@ -5,6 +5,9 @@ import java.io.File; import dev.peerat.mapping.Ship; import dev.peerat.parser.java.Class; import dev.peerat.parser.java.Function; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.value.InstanceValue; +import dev.peerat.parser.java.value.MethodCallValue; public interface Provider{ @@ -14,7 +17,8 @@ public interface Provider{ void mapBottle(Class clazz, Function function); - void mapUses(Class clazz, Function function); + void mapCreation(Class clazz, JavaElement container, InstanceValue value); + void mapEdit(Class clazz, JavaElement container, MethodCallValue value); void complete(); diff --git a/src/dev/peerat/mapping/providers/mysql/MySQlProvider.java b/src/dev/peerat/mapping/providers/mysql/MySQlProvider.java index 2bed7dd..a56ae42 100644 --- a/src/dev/peerat/mapping/providers/mysql/MySQlProvider.java +++ b/src/dev/peerat/mapping/providers/mysql/MySQlProvider.java @@ -19,10 +19,10 @@ import java.util.List; import dev.peerat.mapping.Ship; import dev.peerat.mapping.providers.Provider; import dev.peerat.mapping.providers.ProviderManager; -import dev.peerat.parser.ElementBuilder.Builder; import dev.peerat.parser.Token; import dev.peerat.parser.java.Class; import dev.peerat.parser.java.Function; +import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaFile; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.builder.JavaBuilder; @@ -31,6 +31,7 @@ import dev.peerat.parser.java.builder.JavaFunctionBuilder; import dev.peerat.parser.java.operation.CatchOperation; import dev.peerat.parser.java.operation.ReturnOperation; import dev.peerat.parser.java.operation.TryOperation; +import dev.peerat.parser.java.value.InstanceValue; import dev.peerat.parser.java.value.MethodCallValue; import dev.peerat.parser.java.value.Value; @@ -80,10 +81,14 @@ public class MySQLProvider implements Provider{ } @Override - public void mapUses(Class clazz, Function function){ + public void mapCreation(Class clazz, JavaElement container, InstanceValue value){ + + } + + @Override + public void mapEdit(Class clazz, JavaElement container, MethodCallValue value){ } - @Override public void complete(){ @@ -108,10 +113,10 @@ public class MySQLProvider implements Provider{ .clazz(clazz) .build(); try{ - Builder builder = new Builder(); - file.build(builder); +// Builder builder = new Builder(); +// file.build(builder); BufferedWriter writer = new BufferedWriter(new FileWriter(this.repo)); - builder.build(writer); +// builder.build(writer); writer.flush(); writer.close(); }catch(Exception ex){