package is.L42.connected.withSafeOperators; import java.util.Collections; import java.util.HashSet; import java.util.Set; import ast.ExpCore; import ast.Ast.Path; import ast.ExpCore.*; import ast.ExpCore.ClassB.Member; import coreVisitors.CloneWithPath; import coreVisitors.From; import coreVisitors.FromInClass; import is.L42.connected.withSafeOperators.ExtractInfo.IsUsed; import platformSpecific.javaTranslation.Resources; class Pop { //error conditions: //This0 is not a box //there is not exactly 1 member static ClassB pop(ClassB cb) throws Resources.Error/*BoxError,AmbiguousPop*/{ boolean rightSize=cb.getMs().size()==1; ExtractInfo.checkBox(cb,cb,Collections.emptyList()); if(!rightSize){throw Errors42.errorAmbiguousPop(cb); } return directPop(cb); } static ClassB directPop(ClassB cb) { cb=(ClassB)new PopNFrom(1).visit(cb); ClassB.NestedClass nc = (ClassB.NestedClass)cb.getMs().get(0); ClassB res=(ClassB)nc.getInner(); return res; } static class PopNFrom extends CloneWithPath{ public PopNFrom(int n){this.n=n;} public final int n; @Override protected Path liftP(Path s) { if(s.isPrimitive()){return s;} return popN(n,s); } private Path popN(int n,Path s) { assert n>=0; if (n==0){return s;} if (s.outerNumber()==0){return s;} int nLessK=s.outerNumber() - this.getLocator().getClassNamesPath().size(); if(nLessK>0){//is looking out return popN(n-1,s.setNewOuter(s.outerNumber()-1)); } if(nLessK<0){//is looking in return popN(n-1,s); } //is extacly looking at top level assert !s.getCBar().isEmpty(): s; return popN(n-1,Path.outer(s.outerNumber()-1,s.getCBar().subList(1, s.getCBar().size()))); } } }