use of org.abs_models.frontend.ast.ProductLine in project abstools by abstools.
the class DeltaTrieTest method trieStructure1.
@Test
public void trieStructure1() {
Model model = assertParse("module Test;" + "delta D1;" + "delta D2;" + "productline PL;" + "features A,B;" + "delta D1 after D2 when A;" + "delta D2 when B;" + "root FM {" + " group [0 .. *] { A, B }" + "}");
ProductLine pl = model.getProductLine();
DeltaTrie pfgt = ProductLineAnalysisHelper.buildPFGT(pl, new SemanticConditionList());
// System.out.println(pfgt.toString());
assertTrue(pfgt.getRoot().isValidProduct());
assertEquals(2, pfgt.getRoot().getChildren().size());
assertTrue(pfgt.getRoot().getChildren().get("D1").isValidProduct());
assertTrue(pfgt.getRoot().getChildren().get("D2").isValidProduct());
assertEquals(0, pfgt.getRoot().getChildren().get("D1").getChildren().size());
assertEquals(1, pfgt.getRoot().getChildren().get("D2").getChildren().size());
assertTrue(pfgt.getRoot().getChildren().get("D2").getChildren().get("D1").isValidProduct());
}
use of org.abs_models.frontend.ast.ProductLine in project abstools by abstools.
the class DeltaTrieTest method trieContent.
@Test
public void trieContent() {
// TODO
Model model = assertParse("module Test;" + "class Ccore{}" + "delta D1; uses Test; adds class C1 {Int f1 = 0; Unit m1() {}}" + "delta D2; uses Test; adds class C2 {Int f2 = 0; Unit m2() {}}" + "delta D3;" + // + " modifies class Test.C2 { adds Int f2a = 1; modifies Unit m2() {} adds Unit m2a() {} }"
"" + "" + "" + "" + "productline PL;" + "features A,B;" + "delta D1 when A;" + "delta D2 after D1 when B;" + "delta D3 after D1,D2 when A && B;" + "root FM {" + " group [1 .. *] { A, B }" + "}");
ProductLine pl = model.getProductLine();
DeltaTrie pfgt = ProductLineAnalysisHelper.buildPFGT(pl, new SemanticConditionList());
// TODO: tests
}
use of org.abs_models.frontend.ast.ProductLine in project abstools by abstools.
the class Main method rewriteModel.
/**
* Perform various rewrites that cannot be done in JastAdd.
*
* JastAdd rewrite rules can only rewrite the current node using
* node-local information. ("The code in the body of the rewrite may
* access and rearrange the nodes in the subtree rooted at A, but not any
* other nodes in the AST. Furthermore, the code may not have any other
* side effects." --
* http://jastadd.org/web/documentation/reference-manual.php#Rewrites)
*
* We use this method to generate Exception constructors and the
* information in ABS.Productline.
*
* @param m the model.
* @param productname The name of the product or null.
* @throws WrongProgramArgumentException
*/
private static void rewriteModel(Model m, String productname) throws WrongProgramArgumentException {
// Generate reflective constructors for all features
ProductLine pl = m.getProductLine();
if (pl != null) {
// Let's assume the module and datatype names in abslang.abs did
// not get changed, and just crash otherwise. If you're here
// because of a NPE: Hi! Make the standard library and this code
// agree about what the feature reflection module is called.
ModuleDecl modProductline = null;
DataTypeDecl featureDecl = null;
FunctionDecl currentFeatureFun = null;
FunctionDecl productNameFun = null;
for (ModuleDecl d : m.getModuleDecls()) {
if (d.getName().equals(Constants.PL_NAME)) {
modProductline = d;
break;
}
}
if (modProductline == null) {
throw new WrongProgramArgumentException("Internal error: did not find module " + Constants.PL_NAME + "(should have been defined in the abslang.abs standard library)");
}
for (Decl d : modProductline.getDecls()) {
if (d instanceof DataTypeDecl && d.getName().equals("Feature")) {
featureDecl = (DataTypeDecl) d;
} else if (d instanceof FunctionDecl && d.getName().equals("product_features")) {
currentFeatureFun = (FunctionDecl) d;
} else if (d instanceof FunctionDecl && d.getName().equals("product_name")) {
productNameFun = (FunctionDecl) d;
}
}
// Adjust Feature datatype
featureDecl.setDataConstructorList(new List<>());
for (Feature f : pl.getFeatures()) {
// TODO: when/if we incorporate feature parameters into the
// productline feature declarations (as we should), we need to
// adjust the DataConstructor arguments here.
featureDecl.addDataConstructorNoTransform(new DataConstructor(f.getName(), new List<>()));
}
// Adjust product_name() function
productNameFun.setFunctionDef(new ExpFunctionDef(new StringLiteral(productname)));
// Adjust product_features() function
ProductDecl p = null;
if (productname != null)
p = m.findProduct(productname);
if (p != null) {
DataConstructorExp feature_arglist = new DataConstructorExp("Cons", new List<>());
DataConstructorExp current = feature_arglist;
for (Feature f : p.getProduct().getFeatures()) {
DataConstructorExp next = new DataConstructorExp("Cons", new List<>());
// TODO: when/if we incorporate feature parameters into
// the productline feature declarations (as we should), we
// need to adjust the DataConstructorExp arguments here.
current.addParamNoTransform(new DataConstructorExp(f.getName(), new List<>()));
current.addParamNoTransform(next);
current = next;
}
current.setConstructor("Nil");
currentFeatureFun.setFunctionDef(new ExpFunctionDef(feature_arglist));
}
}
m.flushTreeCache();
}
use of org.abs_models.frontend.ast.ProductLine in project abstools by abstools.
the class DeltaOrderingTest method properSorting1.
@Test
public void properSorting1() throws DeltaModellingException, WrongProgramArgumentException {
Model model = assertParse("module Test;" + "delta D1;" + "delta D2;" + "productline PL;" + "features A,B;" + "delta D1 when A;" + "delta D2 after D1 when B;" + "product P1(A);" + "product P2(A, B);");
model.evaluateAllProductDeclarations();
ProductDecl prod = model.findProduct("P1");
ProductLine pl = model.getProductLine();
Set<String> deltaids = pl.findApplicableDeltas(prod.getProduct());
List<String> sorted_deltaids = pl.sortDeltas(deltaids);
assertArrayEquals(new String[] { "D1" }, sorted_deltaids.toArray());
prod = model.findProduct("P2");
deltaids = pl.findApplicableDeltas(prod.getProduct());
sorted_deltaids = pl.sortDeltas(deltaids);
assertArrayEquals(new String[] { "D1", "D2" }, sorted_deltaids.toArray());
assertFalse(model.typeCheck().containsErrors());
}
use of org.abs_models.frontend.ast.ProductLine in project abstools by abstools.
the class ProgramAbstractionTest method core.
@Test
public void core() {
Model model = assertParse("module M;" + "class C(Rat myParam) { Int myField = 99; Int myMethod(String a, Bool b) { return 88; } }" + "productline PL;" + "features F;");
SemanticConditionList errors = new SemanticConditionList();
ProductLine pl = model.getProductLine();
DeltaTrie trie = ProductLineAnalysisHelper.buildPFGT(pl, errors);
ProgramAbstraction pa = trie.getRoot().getProgramAbstraction();
assertTrue(pa.getClasses().containsKey("M.C"));
assertEquals(2, pa.getClasses().get("M.C").get("fields").keySet().size());
assertTrue(pa.getClasses().get("M.C").get("fields").containsKey("myParam"));
assertEquals("Rat", pa.getClasses().get("M.C").get("fields").get("myParam").get(0));
assertTrue(pa.getClasses().get("M.C").get("fields").containsKey("myField"));
assertEquals("Int", pa.getClasses().get("M.C").get("fields").get("myField").get(0));
assertTrue(pa.getClasses().get("M.C").get("methods").containsKey("myMethod"));
assertEquals(3, pa.getClasses().get("M.C").get("methods").get("myMethod").size());
assertEquals("Int", pa.getClasses().get("M.C").get("methods").get("myMethod").get(0));
assertEquals("String", pa.getClasses().get("M.C").get("methods").get("myMethod").get(1));
assertEquals("Bool", pa.getClasses().get("M.C").get("methods").get("myMethod").get(2));
}
Aggregations