Search in sources :

Example 31 with Member

use of ast.ExpCore.ClassB.Member in project L42 by ElvisResearchGroup.

the class CtxL method fillHole.

public ExpCore.ClassB fillHole(ExpCore hole) {
    Member m = origin.getMs().get(pos);
    m = m.withInner(ctx.fillHole(hole));
    return origin.withMember(m);
}
Also used : Member(ast.ExpCore.ClassB.Member)

Example 32 with Member

use of ast.ExpCore.ClassB.Member in project L42 by ElvisResearchGroup.

the class Methods method methods.

//  -methods(p,P0)=M1'..Mk'
//          p(P0)={interface? implements Ps Ms} 
public List<MethodWithType> methods(Ast.Path p0) {
    if (p0.isPrimitive()) {
        return Collections.emptyList();
    }
    Program p = this;
    ClassB cb0 = p.extractClassB(p0);
    List<Ast.Path> ps = cb0.getSuperPaths();
    //          P1..Pn=collect(p,Ps[from P0]), error unless forall i, p(Pi) is an interface
    List<Ast.Path> p1n = collect(p, Map.of(pi -> From.fromP(pi, p0), ps));
    List<ClassB> cb1n = Map.of(pi -> p.extractClassB(pi), p1n);
    {
        int i = -1;
        for (ClassB cbi : cb1n) {
            i++;
            if (!cbi.isInterface()) {
                throw new ast.ErrorMessage.NonInterfaceImplements(p0, p1n.get(i));
            }
        }
    }
    //          ms1..msk={ms|p(Pi)(ms) is defined}
    HashMap<Ast.MethodSelector, List<ClassB.Member>> ms1k = new LinkedHashMap<>();
    for (ClassB.Member mij : cb0.getMs()) {
        mij.match(nc -> null, mi -> add(true, ms1k, mi.getS(), From.from(mij, p0)), mt -> add(true, ms1k, mt.getMs(), From.from(mij, p0)));
    }
    for (Ast.Path pi : p1n) {
        //call the memoized methods
        for (ClassB.Member mij : p.methods(pi)) {
            mij.match(nc -> null, mi -> add(false, ms1k, mi.getS(), mij), mt -> add(false, ms1k, mt.getMs(), mij));
        }
    }
    //            such that p(Pj)(ms)=mh e? //no refine
    for (Entry<MethodSelector, List<Member>> ei : ms1k.entrySet()) {
        if (!exactly1NoRefine(ei.getValue())) {
            throw new ast.ErrorMessage.NotExaclyOneMethodOrigin(p0, ei.getKey(), ei.getValue());
        }
    }
    List<ClassB.MethodWithType> ms = new ArrayList<>();
    //            for the smallest j in 1..k such that methods(p,Pj)(msi) of form refine? mh
    for (Entry<MethodSelector, List<Member>> ei : ms1k.entrySet()) {
        List<Member> memsi = ei.getValue();
        if (memsi.get(0) != null && memsi.get(0) instanceof MethodWithType) {
            ms.add((MethodWithType) memsi.get(0));
            continue;
        }
        ClassB.MethodImplemented mem0 = (ClassB.MethodImplemented) memsi.get(0);
        for (Member mj : memsi) {
            // 0 will fail instanceof
            if (mj == null || !(mj instanceof MethodWithType)) {
                continue;
            }
            //    Mi'=Mi
            if (mem0 != null) {
                mj = mj.withInner(mem0.getE());
            }
            ms.add(addRefine((MethodWithType) mj));
            break;
        }
    }
    return ms;
}
Also used : From(coreVisitors.From) Ast(ast.Ast) Path(ast.Ast.Path) Map(tools.Map) Set(java.util.Set) HashMap(java.util.HashMap) Member(ast.ExpCore.ClassB.Member) MethodWithType(ast.ExpCore.ClassB.MethodWithType) Collectors(java.util.stream.Collectors) MethodSelector(ast.Ast.MethodSelector) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) List(java.util.List) ClassB(ast.ExpCore.ClassB) Entry(java.util.Map.Entry) Collections(java.util.Collections) MethodSelector(ast.Ast.MethodSelector) ArrayList(java.util.ArrayList) Member(ast.ExpCore.ClassB.Member) LinkedHashMap(java.util.LinkedHashMap) ArrayList(java.util.ArrayList) List(java.util.List) Member(ast.ExpCore.ClassB.Member) ClassB(ast.ExpCore.ClassB) Path(ast.Ast.Path) Ast(ast.Ast) Path(ast.Ast.Path) MethodWithType(ast.ExpCore.ClassB.MethodWithType)

Example 33 with Member

use of ast.ExpCore.ClassB.Member in project L42 by ElvisResearchGroup.

the class CtxL method divide.

public CtxL divide(ExpCore.ClassB all) {
    //already checking there are enough members
    Member m = all.getMs().get(pos);
    CtxC divided = ctx.divide(m.getInner());
    return new CtxL(all, pos, divided);
}
Also used : Member(ast.ExpCore.ClassB.Member)

Example 34 with Member

use of ast.ExpCore.ClassB.Member in project L42 by ElvisResearchGroup.

the class UsedPaths method deepImplements.

private static Paths deepImplements(ClassB l) {
    Paths res = Paths.reorganize(l.getSuperPaths());
    Paths acc = Paths.empty();
    for (Member mi : l.getMs()) {
        if (mi instanceof MethodWithType && !((MethodWithType) mi).get_inner().isPresent()) {
            continue;
        }
        ExpCore e = mi.getInner();
        for (ClassB cbij : CollectClassBs0.of(e)) {
            acc = acc.union(deepImplements(cbij));
        }
    }
    return res.union(acc.pop());
}
Also used : ExpCore(ast.ExpCore) MethodWithType(ast.ExpCore.ClassB.MethodWithType) Member(ast.ExpCore.ClassB.Member) ClassB(ast.ExpCore.ClassB)

Example 35 with Member

use of ast.ExpCore.ClassB.Member in project L42 by ElvisResearchGroup.

the class SumMethods method checkConflict.

private static void checkConflict(List<Ast.C> path, MethodSelector mRes, ClassB pathCb, MethodWithType mwtU) {
    /*for(PathMwt e:pathCb.getStage().getInherited()){
      if(e.getMwt().getMs().equals(mRes)){//method declared in an interface and not implemented
        MethodWithType mtConflict=e.getMwt();
        mtConflict=From.from(mtConflict, From.fromP(e.getOriginal(),Path.outer(0,path)));
        Errors42.checkMethodClash(path, mwtU,mtConflict,false);
        }
    }*/
    //unneded for normalized classb
    Optional<Member> optConflict = Functions.getIfInDom(pathCb.getMs(), mRes);
    if (optConflict.isPresent()) {
        if (optConflict.get() instanceof MethodImplemented) {
            throw Errors42.errorMethodClash(path, mwtU, optConflict.get(), true, Collections.emptyList(), true, true, false);
        }
        MethodWithType mwtC = (MethodWithType) optConflict.get();
        Errors42.checkMethodClash(path, mwtU, mwtC, false);
    }
}
Also used : MethodImplemented(ast.ExpCore.ClassB.MethodImplemented) MethodWithType(ast.ExpCore.ClassB.MethodWithType) Member(ast.ExpCore.ClassB.Member)

Aggregations

Member (ast.ExpCore.ClassB.Member)54 ArrayList (java.util.ArrayList)32 ClassB (ast.ExpCore.ClassB)21 MethodWithType (ast.ExpCore.ClassB.MethodWithType)21 NestedClass (ast.ExpCore.ClassB.NestedClass)20 Ast (ast.Ast)14 ExpCore (ast.ExpCore)11 Path (ast.Ast.Path)10 List (java.util.List)7 Doc (ast.Ast.Doc)5 MethodSelector (ast.Ast.MethodSelector)5 MethodType (ast.Ast.MethodType)5 Collections (java.util.Collections)5 C (ast.Ast.C)4 MethodImplemented (ast.ExpCore.ClassB.MethodImplemented)4 Phase (ast.ExpCore.ClassB.Phase)4 HashSet (java.util.HashSet)4 Optional (java.util.Optional)4 Assertions (tools.Assertions)4 Position (ast.Ast.Position)3