diff --git a/injector/src/main/java/edu/ucr/cs/riple/injector/changes/Change.java b/injector/src/main/java/edu/ucr/cs/riple/injector/changes/Change.java index b834625db..459c8b9bf 100644 --- a/injector/src/main/java/edu/ucr/cs/riple/injector/changes/Change.java +++ b/injector/src/main/java/edu/ucr/cs/riple/injector/changes/Change.java @@ -27,6 +27,7 @@ import com.github.javaparser.ast.nodeTypes.NodeWithRange; import edu.ucr.cs.riple.injector.Helper; import edu.ucr.cs.riple.injector.location.Location; +import edu.ucr.cs.riple.injector.location.LocationToJsonVisitor; import edu.ucr.cs.riple.injector.modifications.Modification; import java.util.Objects; import javax.annotation.Nullable; @@ -89,7 +90,7 @@ public int hashCode() { @SuppressWarnings("unchecked") public JSONObject getJson() { JSONObject res = new JSONObject(); - res.put("LOCATION", location.getJson()); + res.put("LOCATION", location.accept(new LocationToJsonVisitor(), null)); res.put("ANNOTATION", annotation); return res; } diff --git a/injector/src/main/java/edu/ucr/cs/riple/injector/location/Location.java b/injector/src/main/java/edu/ucr/cs/riple/injector/location/Location.java index f19fd9ed7..5bab029fe 100644 --- a/injector/src/main/java/edu/ucr/cs/riple/injector/location/Location.java +++ b/injector/src/main/java/edu/ucr/cs/riple/injector/location/Location.java @@ -38,7 +38,6 @@ import java.util.Objects; import java.util.function.Consumer; import javax.annotation.Nullable; -import org.json.simple.JSONObject; /** Represents a location of an element in the source code. */ public abstract class Location { @@ -50,16 +49,6 @@ public abstract class Location { /** The path to the file containing the element. */ public Path path; - /** The Keys used to represent a location in JSON format */ - public enum KEYS { - VARIABLES, - METHOD, - KIND, - CLASS, - PATH, - INDEX - } - /** * Creates an instance of {@link Location} for a given type, path and class. This constructor is a * base class for all subclasses and must provide these values upon instantiation. @@ -126,13 +115,6 @@ public static Location createLocationFromArrayInfo(String[] values) { protected abstract Modification applyToMember( NodeList> members, Change change); - /** - * Fills the given JSON object with the information of this location. - * - * @param res The JSON object to be filled. - */ - protected abstract void fillJsonInformation(JSONObject res); - /** * Applies the change to the target element on the given compilation unit tree. * @@ -152,16 +134,6 @@ public Modification apply(CompilationUnit tree, Change change) { return applyToMember(clazz, change); } - @SuppressWarnings("unchecked") - public JSONObject getJson() { - JSONObject res = new JSONObject(); - res.put(KEYS.CLASS, clazz); - res.put(KEYS.KIND, type.toString()); - res.put(KEYS.PATH, path); - fillJsonInformation(res); - return res; - } - /** * If this location is of kind {@link LocationKind#METHOD}, calls the consumer on the location. * diff --git a/injector/src/main/java/edu/ucr/cs/riple/injector/location/LocationToJsonVisitor.java b/injector/src/main/java/edu/ucr/cs/riple/injector/location/LocationToJsonVisitor.java new file mode 100644 index 000000000..ee0736b4e --- /dev/null +++ b/injector/src/main/java/edu/ucr/cs/riple/injector/location/LocationToJsonVisitor.java @@ -0,0 +1,83 @@ +/* + * MIT License + * + * Copyright (c) 2023 Nima Karimipour + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package edu.ucr.cs.riple.injector.location; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +/** A visitor that converts a location to a JSON object. */ +public class LocationToJsonVisitor implements LocationVisitor { + + /** The Keys used to represent a location in JSON format */ + public enum KEYS { + VARIABLES, + METHOD, + KIND, + CLASS, + PATH, + INDEX + } + + @SuppressWarnings("unchecked") + private JSONObject defaultAction(Location location) { + JSONObject res = new JSONObject(); + res.put(KEYS.CLASS, location.clazz); + res.put(KEYS.KIND, location.type.toString()); + res.put(KEYS.PATH, location.path); + return res; + } + + @SuppressWarnings("unchecked") + @Override + public JSONObject visitMethod(OnMethod onMethod, Void unused) { + JSONObject res = defaultAction(onMethod); + res.put(KEYS.METHOD, onMethod.method); + return res; + } + + @SuppressWarnings("unchecked") + @Override + public JSONObject visitField(OnField onField, Void unused) { + JSONObject res = defaultAction(onField); + JSONArray fields = new JSONArray(); + fields.addAll(onField.variables); + res.put(KEYS.VARIABLES, fields); + return res; + } + + @SuppressWarnings("unchecked") + @Override + public JSONObject visitParameter(OnParameter onParameter, Void unused) { + JSONObject res = defaultAction(onParameter); + res.put(KEYS.METHOD, onParameter.method); + res.put(KEYS.INDEX, onParameter.index); + return res; + } + + @Override + public JSONObject visitClass(OnClass onClass, Void unused) { + return defaultAction(onClass); + } +} diff --git a/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnClass.java b/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnClass.java index 86af0b459..3260d1d91 100644 --- a/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnClass.java +++ b/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnClass.java @@ -34,7 +34,6 @@ import java.util.Optional; import java.util.regex.Pattern; import javax.annotation.Nullable; -import org.json.simple.JSONObject; /** Represents a location for class element. This location is used to apply changes to a class. */ public class OnClass extends Location { @@ -76,11 +75,6 @@ public static boolean isAnonymousClassFlatName(String flatName) { return anonymousClassPattern.matcher(flatName).matches(); } - @Override - protected void fillJsonInformation(JSONObject res) { - // no op - } - @Override public R accept(LocationVisitor v, P p) { return v.visitClass(this, p); diff --git a/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnField.java b/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnField.java index e4de051a0..ec4380274 100644 --- a/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnField.java +++ b/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnField.java @@ -37,8 +37,6 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import javax.annotation.Nullable; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; /** * Represents a location for field element. This location is used to apply changes to a class field. @@ -68,14 +66,6 @@ public OnField(String path, String clazz, Set variables) { this(Helper.deserializePath(path), clazz, variables); } - @SuppressWarnings("unchecked") - @Override - protected void fillJsonInformation(JSONObject res) { - JSONArray fields = new JSONArray(); - fields.addAll(variables); - res.put(KEYS.VARIABLES, fields); - } - @Override @Nullable protected Modification applyToMember(NodeList> members, Change change) { diff --git a/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnMethod.java b/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnMethod.java index c57287d4b..1da79b3a5 100644 --- a/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnMethod.java +++ b/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnMethod.java @@ -35,7 +35,6 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import javax.annotation.Nullable; -import org.json.simple.JSONObject; /** Represents a location for method element. This location is used to apply changes to a method. */ public class OnMethod extends Location { @@ -58,12 +57,6 @@ public OnMethod(String path, String clazz, String method) { this(Helper.deserializePath(path), clazz, method); } - @SuppressWarnings("unchecked") - @Override - protected void fillJsonInformation(JSONObject res) { - res.put(KEYS.METHOD, method); - } - @Override @Nullable protected Modification applyToMember(NodeList> members, Change change) { diff --git a/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnParameter.java b/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnParameter.java index b1aaad7c1..2c10a32ff 100644 --- a/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnParameter.java +++ b/injector/src/main/java/edu/ucr/cs/riple/injector/location/OnParameter.java @@ -37,7 +37,6 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import javax.annotation.Nullable; -import org.json.simple.JSONObject; /** * Represents a location for parameter element. This location is used to apply changes to a @@ -66,13 +65,6 @@ public OnParameter(String path, String clazz, String method, int index) { this(Helper.deserializePath(path), clazz, method, index); } - @SuppressWarnings("unchecked") - @Override - protected void fillJsonInformation(JSONObject res) { - res.put(KEYS.METHOD, method); - res.put(KEYS.INDEX, index); - } - @Override @Nullable protected Modification applyToMember(NodeList> members, Change change) {