package ast; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import lombok.EqualsAndHashCode; import lombok.ToString; import lombok.Value; import lombok.experimental.Wither; import sugarVisitors.CollapsePositions; import ast.Ast; import ast.Ast.Position; import ast.ExpCore; import ast.Ast.HistoricType; import ast.Ast.MethodSelector; import ast.Ast.Path; import ast.Ast.Type; import ast.ExpCore.Block; import ast.ExpCore.ClassB; import ast.Util.PathMwt; import coreVisitors.InjectionOnSugar; @SuppressWarnings("serial") public abstract class ErrorMessage extends RuntimeException { public static interface PosImprove{ Position getPos(); PosImprove withPos(Position val); default PosImprove improvePos(Position val){ if(this.getPos()!=null){val=CollapsePositions.accumulatePos(this.getPos(),val);} return this.withPos(val); } static ErrorMessage improve(ErrorMessage err,Position val){ if(! (err instanceof ErrorMessage.PosImprove)){return err;} return (ErrorMessage)((ErrorMessage.PosImprove)err).improvePos(val); } } @Override public String getMessage() { return super.getMessage();//+this.toString(); } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class UserLevelError extends ErrorMessage implements PosImprove { static public enum Kind { WellFormedness, TypeError, MetaError, Unclassified } Kind kind; Ast.Position pos; ErrorMessage internal; String errorTxt; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class FinalResult extends ErrorMessage { int result; ClassB topLevelProgram; public int getErrCode() { return result; } } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class MalformedFinalResult extends ErrorMessage { ClassB finalRes; String reason; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class ImpossibleToCompose extends ErrorMessage { List<ClassB.Member> inherited; List<ClassB.Member> alreadyOffered; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class IncoherentMwts extends ErrorMessage implements PosImprove{ ast.Ast.MethodSelector guilty; List<Ast.C> exploredPath; List<PathMwt> incoherent; Ast.Position pos;} @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class MalformedUnionOfMembers extends ErrorMessage { ClassB.MethodWithType mFromInterface; ClassB.MethodWithType mFromClass; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class TwoDifferentImplementedInterfacesDeclareMethod extends ErrorMessage { MethodSelector mFromInterface; ClassB cb; List<ClassB> p; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class InvalidMethodImplemented extends ErrorMessage { List<ClassB.Member> mFromInterface; ClassB.MethodImplemented mFromClass; ClassB cb; List<ClassB> p; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class MalformedSubtypeDeclaration extends ErrorMessage { ClassB implementer; ClassB notInterfaceImplemented; Path implemented; List<ClassB> p; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class ProgramExtractOnWalkBy extends ErrorMessage { Path path; List<ClassB> p; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class CtxExtractImpossible extends ErrorMessage { ExpCore e; List<ClassB> p; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class ExpectedImmutableVar extends ErrorMessage { ExpCore ctxVal; String x; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class IllegalAttemptedModification extends ErrorMessage { ExpCore ctxVal; Block.Dec dec; ExpCore.MCall mc; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class NormalForm extends ErrorMessage { ExpCore e; List<ClassB> p; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class ParsingError extends ErrorMessage { //others should extend it? but some have a range position! int line; int pos; String token; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class DotDotDotCanNotBeResolved extends ErrorMessage { String reason; //java.nio.file.Path orignFileName; Expression.ClassB.NestedClass hasDotDotDot; java.nio.file.Path path; } //***************************** public static abstract class PreParserError extends ErrorMessage { } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class InvalidCharacter extends PreParserError { String file; String message; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class InvalidCharacterOutOfString extends PreParserError { String file; int line; int pos; String token; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class InvalidCharacterInMultilineStringIndentation extends PreParserError { String file; int line; int pos; String token; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class UnclosedStringLiteral extends PreParserError { String file; int line; int pos; String token; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class UnclosedParenthesis extends PreParserError { String file; int line; int pos; String token; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class UnopenedParenthesis extends PreParserError { String file; int line; int pos; String token; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class ParenthesisMismatchRange extends PreParserError { String file; int line1; int pos1; String token1; int line2; int pos2; String token2; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class LibraryRefersToIncompleteClasses extends TypeError { List<ClassB> p; ClassB cb; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class PathMetaOrNonExistant extends TypeError implements PosImprove{ boolean isMeta; List<Ast.C> listOfNodeNames; ClassB cb; Position pos; Position wherePathWasWritten; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class PathNonStar extends TypeError { Path path; HashMap<String, Ast.NormType> varEnv; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class VariableDeclaredMultipleTimes extends ErrorMessage implements ErrorMessage.PosImprove{ String x; Ast.Position pos; } //when a plugin exists but chose to not act @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class PluginActionUndefined extends ErrorMessage { int wait; //-1 to act at the end, -2...-n to never act again; otherwise // some time in milliseconds to try acting again. } public abstract static class NotWellFormed extends ErrorMessage { } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class VariableUsedNotInScope extends NotWellFormed { Expression.X e; Expression ctx; String reason; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class NotWellFormedMsk extends NotWellFormed { //msk for misk, this class will be multiplied on need when is needed to distinguis the various kinds Expression e; Expression ctx; String reason; } //Type system //@ToString(callSuper=false, includeFieldNames=true) @Wither public static abstract class TypeError extends ErrorMessage implements ErrorMessage.PosImprove { public final List<facade.ErrorFormatter.Reporter> envs = new ArrayList<>(); @Override public String getMessage() { return this.envs.toString(); } } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class NotOkToStar extends TypeError { ClassB ct; ExpCore.ClassB.MethodWithType ctor; String reason; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class PluginMethodUndefined extends TypeError { List<String> validMethods; ExpCore.Using using; List<ClassB> p; Position pos; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class NormImpossible extends ErrorMessage { Type notNorm; Throwable cause; List<ClassB> p; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class CircularImplements extends ErrorMessage { List<Ast.Path> visited; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class NonInterfaceImplements extends ErrorMessage { Ast.Path implementer; Ast.Path implemented; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class NotExaclyOneMethodOrigin extends ErrorMessage { Ast.Path guilty; Ast.MethodSelector selector; List<ExpCore.ClassB.Member>allMs; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class HistoricTypeNoTarget extends ErrorMessage { Ast.HistoricType guilty; List<ExpCore.ClassB.MethodWithType>allMs; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class HistoricTypeCircularDefinition extends ErrorMessage { Ast.HistoricType guilty; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class LentShuldBeMutable extends ErrorMessage { ExpCore.X var; } @Value @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class VariableSealed extends ErrorMessage { ExpCore.X var; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class InvalidTypeForThrowe extends TypeError { ExpCore.Signal e; Ast.NormType computedType; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class CapsuleUsedMoreThenOne extends TypeError { List<ExpCore> es; String varName; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class UnresolvedType extends TypeError { HistoricType t; ExpCore e; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class IncompleteClassIsRequired extends TypeError { String reason; ExpCore e; Path path; List<ClassB> p; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class ExceptionThrownNotCaptured extends TypeError { ExpCore e; Path path1; HashSet<Path> exceptions2; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class ConfusedResultingTypeForMultiCatch extends TypeError { List<ExpCore.Block.On> k; HashSet<Type> options; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class ConfusedResultingTypeForCatchAndBlock extends TypeError { ExpCore.Block e; Type te; Type tk; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class PathsNotSubtype extends TypeError { Type tActual; Type tExpected; ExpCore e; List<ClassB> p; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class TypesNotSubtype extends TypeError { Type tActual; Type tExpected; ExpCore e; Throwable promotionAttemptedBut; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class MethodNotPresent extends TypeError implements PosImprove{ Path path; MethodSelector ms; ExpCore.MCall call; List<ClassB> p; Position pos; } //not used right now, may be is not useful @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class UnlockImpossible extends TypeError { Throwable unlockAttemptedBut; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class InvalidURL extends TypeError { String url; Position pos; } @Value @Wither @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true, includeFieldNames = true) public static class PromotionImpossible extends TypeError { Type pFrom; Type pTo; Throwable sealCause; ExpCore inner; Position pos; } }