use of ast.Util.PathSPath in project L42 by ElvisResearchGroup.
the class Redirect method redirectOkAux.
private static void redirectOkAux(Program p, PathSPath current, ClassB cbTop, List<PathSPath> ambiguities, List<SPathSPath> exceptions) {
assert current.getPathsSet().size() == 1;
List<Ast.C> cs = current.getPath().getCBar();
if (cs.isEmpty()) {
throw Errors42.errorInvalidOnTopLevel();
}
Errors42.checkExistsPathMethod(cbTop, cs, Optional.empty());
//Boolean[] csPrivate=new Boolean[]{false};
ClassB currentIntCb = cbTop.getClassB(cs);
//path exists by construction.
Path path = current.getPathsSet().iterator().next();
ClassB currentExtCb;
if (path.isCore()) {
assert path.outerNumber() > 0 : path;
currentExtCb = p.extractClassB(path);
} else {
assert path.isPrimitive();
currentExtCb = ClassB.membersClass(Collections.emptyList(), Position.noInfo, cbTop.getPhase()).withInterface(path.equals(Path.Any()));
}
assert cs.stream().allMatch(c -> !c.isUnique());
boolean isPrivateState = ExtractInfo.hasPrivateState(currentIntCb);
boolean isNoImplementation = ExtractInfo.isNoImplementation(currentIntCb);
boolean headerOk = currentIntCb.isInterface() == currentExtCb.isInterface();
ClassKind kindSrc = ExtractInfo.classKind(cbTop, cs, currentIntCb, null, isPrivateState, isNoImplementation);
if (!headerOk && !currentIntCb.isInterface()) {
if (kindSrc == ClassKind.FreeTemplate) {
headerOk = true;
}
}
ClassKind kindDest = ExtractInfo.classKind(null, null, currentExtCb, null, null, null);
if (isPrivateState || !isNoImplementation) {
//unexpectedMembers stay empty if there is implementation
assert kindSrc != ClassKind.FreeTemplate || kindSrc != ClassKind.Template || kindSrc != ClassKind.Interface : kindSrc;
throw Errors42.errorSourceUnfit(current.getPath().getCBar(), path, kindSrc, kindDest, Collections.emptyList(), headerOk, Collections.emptyList());
}
redirectOkImpl(kindSrc, kindDest, ambiguities, current, currentIntCb, currentExtCb);
List<Member> unexpectedMembers = new ArrayList<>();
for (Member mi : currentIntCb.getMs()) {
Optional<Member> miPrime = Functions.getIfInDom(currentExtCb.getMs(), mi);
if (miPrime.isPresent() && miPrime.get().getClass().equals(mi.getClass())) {
Member miGet = miPrime.get();
redirectOkMember(ambiguities, exceptions, mi, miGet, current);
} else {
unexpectedMembers.add(mi);
}
}
if (unexpectedMembers.isEmpty() && headerOk) {
return;
}
if (kindSrc == null) {
kindSrc = ExtractInfo.classKind(cbTop, cs, currentIntCb, null, isPrivateState, isNoImplementation);
}
if (kindDest == null) {
kindDest = ExtractInfo.classKind(null, null, currentExtCb, null, null, null);
}
throw Errors42.errorSourceUnfit(cs, path, kindSrc, kindDest, unexpectedMembers, headerOk, Collections.emptyList());
}
use of ast.Util.PathSPath in project L42 by ElvisResearchGroup.
the class Redirect method redirectOkImpl.
private static void redirectOkImpl(ClassKind kindSrc, ClassKind kindDest, List<PathSPath> ambiguities, PathSPath current, ClassB currentIntCb, ClassB currentExtCb) {
// List<Path>unexpectedInterfaces=new ArrayList<>(unexpectedI);
// Collections.sort(unexpectedInterfaces,(pa,pb)->pa.toString().compareTo(pb.toString()));
List<Path> extPs = currentExtCb.getSuperPaths();
Path destP = current.getPathsSet().iterator().next();
extPs = Map.of(pi -> From.fromP(pi, destP), extPs);
List<Path> unexpectedInterfaces = new ArrayList<>();
for (Path pi : currentIntCb.getSuperPaths()) {
Path pif = From.fromP(pi, current.getPath());
if (extPs.isEmpty()) {
unexpectedInterfaces.add(pif);
} else if (pif.isPrimitive() || pif.outerNumber() > 0) {
if (!extPs.contains(pif)) {
unexpectedInterfaces.add(pif);
}
} else {
plusEqual(ambiguities, pif, extPs);
}
}
if (unexpectedInterfaces.isEmpty()) {
return;
}
throw Errors42.errorSourceUnfit(current.getPath().getCBar(), current.getPathsSet().iterator().next(), kindSrc, kindDest, Collections.emptyList(), true, unexpectedInterfaces);
}
use of ast.Util.PathSPath in project L42 by ElvisResearchGroup.
the class Redirect method redirectOk.
public static List<PathPath> redirectOk(Program p, ClassB cbTop, Path internal, Path external) {
List<PathPath> verified = new ArrayList<>();
verifiedForErrorMsg = verified;
List<PathSPath> ambiguities = new ArrayList<>();
List<SPathSPath> exceptions = new ArrayList<>();
ambiguities.add(new PathSPath(internal, new HashSet<>(Arrays.asList(external))));
for (PathSPath current = choseUnabigus(ambiguities); current != null; current = choseUnabigus(ambiguities)) {
//closure final limitations
PathSPath _current = current;
assert ambiguitiesOk(ambiguities);
assert verified.stream().allMatch(pp -> !pp.getPath1().equals(_current.getPath())) : verified + " " + _current.getPath();
redirectOkAux(p, current, cbTop, ambiguities, exceptions);
assert current.getPathsSet().size() == 1;
assert verified.stream().allMatch(pp -> !pp.getPath1().equals(_current.getPath())) : verified + " " + _current.getPath();
verified.add(new PathPath(current.getPath(), current.getPathsSet().iterator().next()));
accumulateVerified(ambiguities, verified);
}
assert choseUnabigus(ambiguities) == null;
if (!ambiguities.isEmpty()) {
throw Errors42.errorIncoherentRedirectMapping(verified, ambiguities, null, Collections.emptyList());
}
checkExceptionOk(exceptions, verified);
return verified;
}
use of ast.Util.PathSPath in project L42 by ElvisResearchGroup.
the class Redirect method plusEqual.
private static void plusEqual(List<PathSPath> ambiguities, Path pif, List<Path> extPs) {
assert ambiguitiesOk(ambiguities);
try {
assert !extPs.isEmpty();
assert !extPs.contains(null);
assert !pif.isPrimitive() && pif.outerNumber() == 0;
for (PathSPath psp : ambiguities) {
if (psp.getPath().equals(pif)) {
psp.setPathsSet(new HashSet<>(psp.getPathsSet()));
assert !psp.getPathsSet().isEmpty();
Path forErr = psp.getPathsSet().iterator().next();
psp.getPathsSet().retainAll(extPs);
if (psp.getPathsSet().isEmpty()) {
List<Path> psErr = Arrays.asList(forErr, extPs.get(0));
throw Errors42.errorIncoherentRedirectMapping(Redirect.verifiedForErrorMsg, ambiguities, psp.getPath(), psErr);
}
return;
}
}
ambiguities.add(new PathSPath(pif, new HashSet<>(extPs)));
} finally {
assert ambiguitiesOk(ambiguities);
}
}
use of ast.Util.PathSPath in project L42 by ElvisResearchGroup.
the class Redirect method redirectOkMember.
private static void redirectOkMember(List<PathSPath> ambiguities, List<SPathSPath> exceptions, Member mi, Member miGet, PathSPath current) {
if (mi instanceof NestedClass) {
assert miGet instanceof NestedClass;
assert ((NestedClass) mi).getName().equals(((NestedClass) miGet).getName());
Path src = current.getPath().pushC(((NestedClass) mi).getName());
Path dest = current.getPathsSet().iterator().next().pushC(((NestedClass) mi).getName());
plusEqual(ambiguities, src, Arrays.asList(dest));
return;
}
assert mi.getClass().equals(miGet.getClass());
assert mi instanceof MethodWithType : mi;
MethodWithType mwtSrc = (MethodWithType) mi;
MethodWithType mwtDest = (MethodWithType) miGet;
//this is what happens in p.method
mwtSrc = From.from(mwtSrc, current.getPath());
mwtDest = From.from(mwtDest, current.getPathsSet().iterator().next());
assert mwtSrc.getMs().equals(mwtDest.getMs());
boolean thisMdfOk = mwtSrc.getMt().getMdf().equals(mwtDest.getMt().getMdf());
boolean retOk = redirectOkT(ambiguities, mwtSrc.getMt().getReturnType(), mwtDest.getMt().getReturnType());
List<Integer> parWrong = new ArrayList<Integer>();
{
int i = -1;
for (Type tSrc : mwtSrc.getMt().getTs()) {
i += 1;
Type tDest = mwtDest.getMt().getTs().get(i);
if (!redirectOkT(ambiguities, tSrc, tDest)) {
parWrong.add(i);
}
;
}
}
boolean excOk = plusEqualAndExc(ambiguities, exceptions, current.getPath(), mwtSrc, mwtDest);
if (thisMdfOk && retOk && excOk && parWrong.isEmpty()) {
return;
}
throw Errors42.errorMethodClash(current.getPath().getCBar(), mwtSrc, mwtDest, excOk, parWrong, retOk, thisMdfOk, false);
}
Aggregations