Search in sources :

Example 11 with TypeError

use of abs.frontend.analyser.TypeError in project abstools by abstools.

the class FinalAnnotationTypeExtension method checkAssignStmt.

@Override
public void checkAssignStmt(AssignStmt s) {
    VarOrFieldDecl decl = s.getVar().getDecl();
    if (decl instanceof TypedVarOrFieldDecl) {
        TypedVarOrFieldDecl d = (TypedVarOrFieldDecl) decl;
        // Not sure if this code will encounter delta bodies:
        if (d.isFinal()) {
            String name = d.getName();
            boolean isField = (d instanceof FieldDecl);
            String kind = isField ? "field" : "variable";
            add(new TypeError(s, ErrorMessage.ASSIGN_TO_FINAL, kind, name));
        }
    } else {
    // It's a PatternVarDecl.  Assume these are never final.
    }
}
Also used : VarOrFieldDecl(abs.frontend.ast.VarOrFieldDecl) FieldDecl(abs.frontend.ast.FieldDecl) TypedVarOrFieldDecl(abs.frontend.ast.TypedVarOrFieldDecl) VarOrFieldDecl(abs.frontend.ast.VarOrFieldDecl) TypedVarOrFieldDecl(abs.frontend.ast.TypedVarOrFieldDecl) TypedVarOrFieldDecl(abs.frontend.ast.TypedVarOrFieldDecl) TypeError(abs.frontend.analyser.TypeError)

Example 12 with TypeError

use of abs.frontend.analyser.TypeError in project abstools by abstools.

the class ProductLineAnalysisHelper method isStronglyUnambiguous.

/*
     * A product line is strongly unambiguous if each set in the partition of
     * the delta modules specified in the product-line declaration is
     * consistent, that is, if one delta module in a set adds or removes a
     * class, no other delta module in the same set may add, remove or modify
     * the same class, and the modifications of the same class in different
     * delta modules in the same set have to be disjoint.
     */
public static boolean isStronglyUnambiguous(ProductLine pl, SemanticConditionList errors) {
    boolean result = true;
    Model model = pl.getModel();
    /*
        System.out.print("Delta partition: ");
        for (Set<String> set : pl.getDeltaPartition()) {
            System.out.print("{");
            for (String el : set)
                System.out.print(" " + el + " ");
            System.out.print("}   ");
        }
        System.out.println();
         */
    assert pl.getDeltaPartition() != null;
    for (Set<String> set : pl.getDeltaPartition()) {
        // Remember the names of classes and methods modified by deltas in
        // current set
        // { Module.Class -> { Method -> Delta } }
        // { Module.Class -> { "CLASS" -> Delta } }
        Map<String, Map<String, String>> cache = new HashMap<>();
        for (String deltaID : set) {
            // assumes the DeltaDecl corresponding to deltaID exists (wellFormedProductLine)
            DeltaDecl delta = model.getDeltaDeclsMap().get(deltaID);
            assert delta.getModuleModifiers() != null;
            for (ModuleModifier moduleModifier : delta.getModuleModifiers()) {
                if (moduleModifier instanceof ModifyClassModifier) {
                    // String methodID;
                    String prefix = ((ClassModifier) moduleModifier).qualifiedName();
                    for (Modifier mod : ((ModifyClassModifier) moduleModifier).getModifiers()) {
                        if (mod instanceof DeltaTraitModifier) {
                            HashSet<String> methodIDSet = new HashSet<>();
                            ((DeltaTraitModifier) mod).collectMethodIDs(methodIDSet, model);
                            for (String methodID : methodIDSet) {
                                if (cache.containsKey(prefix)) {
                                    if (cache.get(prefix).containsKey(methodID)) {
                                        result = false;
                                        String otherDeltaID = cache.get(prefix).get(methodID);
                                        if (!deltaID.equals(otherDeltaID))
                                            errors.add(new TypeError(pl, ErrorMessage.AMBIGUOUS_PRODUCTLINE, pl.getName(), deltaID, otherDeltaID, prefix + ", method " + methodID));
                                        else
                                            // FIXME also a kind of ambiguity but needs a different error message
                                            ;
                                    } else if (cache.get(prefix).containsKey("CLASS")) {
                                        result = false;
                                        String otherDeltaID = cache.get(prefix).get("CLASS");
                                        if (!deltaID.equals(otherDeltaID))
                                            errors.add(new TypeError(pl, ErrorMessage.AMBIGUOUS_PRODUCTLINE, pl.getName(), deltaID, otherDeltaID, prefix));
                                        else
                                            // FIXME also a kind of ambiguity but needs a different error message
                                            ;
                                    } else {
                                        cache.get(prefix).put(methodID, deltaID);
                                    }
                                } else {
                                    cache.put(prefix, new HashMap<>());
                                    cache.get(prefix).put(methodID, deltaID);
                                }
                            }
                        }
                    }
                } else if (moduleModifier instanceof AddClassModifier || moduleModifier instanceof RemoveClassModifier) {
                    String prefix = ((ClassModifier) moduleModifier).qualifiedName();
                    if (cache.containsKey(prefix)) {
                        result = false;
                        assert !cache.get(prefix).isEmpty();
                        String otherDeltaID = cache.get(prefix).values().iterator().next();
                        errors.add(new TypeError(pl, ErrorMessage.AMBIGUOUS_PRODUCTLINE, pl.getName(), deltaID, otherDeltaID, prefix));
                        System.out.println("3 ambiguity due to " + deltaID + "<>" + otherDeltaID);
                    } else {
                        cache.put(prefix, new HashMap<>());
                        cache.get(prefix).put("CLASS", deltaID);
                    }
                }
            }
        // TODO apply same reasoning to other elements: fields,
        // functions, ADTs, etc
        }
    }
    // TODO remove boolean result unless needed
    return result;
}
Also used : HashMap(java.util.HashMap) TypeError(abs.frontend.analyser.TypeError) Map(java.util.Map) HashMap(java.util.HashMap) HashSet(java.util.HashSet)

Example 13 with TypeError

use of abs.frontend.analyser.TypeError in project abstools by abstools.

the class TypeCheckerHelper method typeCheckEqualPattern.

private static void typeCheckEqualPattern(SemanticConditionList l, ConstructorPattern n, java.util.List<Type> params) {
    List<Pattern> args = n.getParams();
    if (params.size() != args.getNumChild()) {
        l.add(new TypeError(n, ErrorMessage.WRONG_NUMBER_OF_ARGS, params.size(), args.getNumChild()));
    } else {
        for (int i = 0; i < params.size(); i++) {
            Type argType = params.get(i);
            Pattern exp = args.getChild(i);
            exp.typeCheck(l, argType);
        }
    }
}
Also used : TypeError(abs.frontend.analyser.TypeError)

Example 14 with TypeError

use of abs.frontend.analyser.TypeError in project abstools by abstools.

the class TypeCheckerHelper method checkForDuplicateDecls.

public static void checkForDuplicateDecls(ModuleDecl mod, SemanticConditionList errors) {
    Map<KindedName, ResolvedName> duplicateNames = new HashMap<>();
    Map<KindedName, ResolvedName> names = getVisibleNames(mod, duplicateNames);
    for (KindedName n : duplicateNames.keySet()) {
        ResolvedName rn = names.get(n);
        ResolvedName origrn = duplicateNames.get(n);
        ErrorMessage msg = null;
        String location = "";
        Decl decl = null;
        if (origrn instanceof ResolvedDeclName) {
            decl = ((ResolvedDeclName) origrn).getDecl();
        } else if (origrn instanceof ResolvedAmbigiousName) {
            decl = ((AmbiguousDecl) ((ResolvedAmbigiousName) origrn).getDecl()).getAlternative().get(0);
        }
        if (decl != null && !decl.getFileName().equals(abs.frontend.parser.Main.UNKNOWN_FILENAME)) {
            location = " at " + decl.getFileName() + ":" + decl.getStartLine() + ":" + decl.getStartColumn();
        }
        switch(n.getKind()) {
            case CLASS:
                msg = ErrorMessage.DUPLICATE_CLASS_NAME;
                break;
            case FUN:
                msg = ErrorMessage.DUPLICATE_FUN_NAME;
                break;
            case PARTIAL_FUN:
                msg = ErrorMessage.DUPLICATE_PARTIAL_FUN_NAME;
                break;
            case DATA_CONSTRUCTOR:
                msg = ErrorMessage.DUPLICATE_CONSTRUCTOR;
                break;
            case TYPE_DECL:
                msg = ErrorMessage.DUPLICATE_TYPE_DECL;
                break;
            case TRAIT_DECL:
                msg = ErrorMessage.DUPLICATE_TRAIT_NAME;
                break;
            case MODULE:
                // doesn't happen, no modules within modules
                assert false;
                break;
            default:
                // detect if we added a new KindedName.Kind
                assert false;
                break;
        }
        errors.add(new TypeError(rn.getDecl(), msg, n.getName(), location));
    }
}
Also used : TypeError(abs.frontend.analyser.TypeError) ErrorMessage(abs.frontend.analyser.ErrorMessage)

Example 15 with TypeError

use of abs.frontend.analyser.TypeError in project abstools by abstools.

the class TypeCheckerHelper method typeCheckEqual.

public static void typeCheckEqual(SemanticConditionList l, ASTNode<?> n, java.util.List<Type> params) {
    List<PureExp> args = ((HasActualParams) n).getParams();
    if (params.size() != args.getNumChild()) {
        l.add(new TypeError(n, ErrorMessage.WRONG_NUMBER_OF_ARGS, params.size(), args.getNumChild()));
    } else {
        for (int i = 0; i < params.size(); i++) {
            Type argType = params.get(i);
            PureExp exp = args.getChild(i);
            int nerrors = l.getErrorCount();
            exp.typeCheck(l);
            if (nerrors == l.getErrorCount()) {
                Type expType = exp.getType();
                if (!expType.isAssignableTo(argType)) {
                    l.add(new TypeError(n, ErrorMessage.TYPE_MISMATCH, exp.getType(), argType));
                }
            }
        }
    }
}
Also used : TypeError(abs.frontend.analyser.TypeError)

Aggregations

TypeError (abs.frontend.analyser.TypeError)17 FrontendTest (abs.frontend.FrontendTest)2 SemanticConditionList (abs.frontend.analyser.SemanticConditionList)2 SemanticWarning (abs.frontend.analyser.SemanticWarning)2 FieldDecl (abs.frontend.ast.FieldDecl)2 Model (abs.frontend.ast.Model)2 HashSet (java.util.HashSet)2 Test (org.junit.Test)2 ErrorMessage (abs.frontend.analyser.ErrorMessage)1 SemanticError (abs.frontend.analyser.SemanticError)1 abs.frontend.ast (abs.frontend.ast)1 Annotation (abs.frontend.ast.Annotation)1 ClassDecl (abs.frontend.ast.ClassDecl)1 FnApp (abs.frontend.ast.FnApp)1 FunctionDecl (abs.frontend.ast.FunctionDecl)1 ParamDecl (abs.frontend.ast.ParamDecl)1 PureExp (abs.frontend.ast.PureExp)1 TypedVarOrFieldDecl (abs.frontend.ast.TypedVarOrFieldDecl)1 VarOrFieldDecl (abs.frontend.ast.VarOrFieldDecl)1 VarOrFieldUse (abs.frontend.ast.VarOrFieldUse)1