| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-13 10:46:38 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-13 10:46:38 +0200 | 
| commit | a18c6292ba435f13c968c71ae40ff921c69e5042 (patch) | |
| tree | 45b985e6053fc9d28285469fe0b1fbb5c30456cd /src/core | |
| parent | 18581bcbd25bd48c54f41755a51444923c903db8 (diff) | |
Cleans up instruction building asserts.
Diffstat (limited to 'src/core')
29 files changed, 528 insertions, 1383 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/error/IncorrectReturnTypeException.java b/src/core/src/tonkadur/fate/v1/error/IncorrectReturnTypeException.java new file mode 100644 index 0000000..5ea4457 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/error/IncorrectReturnTypeException.java @@ -0,0 +1,60 @@ +package tonkadur.fate.v1.error; + +import tonkadur.error.ErrorLevel; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; + +public class IncorrectReturnTypeException extends ParsingError +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Type given_type; +   protected final Type allowed_type; + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   public IncorrectReturnTypeException +   ( +      final Origin call_origin, +      final Type given_type, +      final Type allowed_type +   ) +   { +      super +      ( +         ErrorLevel.FATAL, +         ErrorCategory.INVALID_USE, +         call_origin +      ); + +      this.given_type = given_type; +      this.allowed_type = allowed_type; +   } + + +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append(origin.toString()); +      sb.append(" "); +      sb.append(error_category.toString()); +      sb.append(System.lineSeparator()); + +      sb.append("Return type '"); +      sb.append(given_type.toString()); +      sb.append("'"); + +      sb.append(" is not allowed here. Use '"); +      sb.append(allowed_type.toString()); +      sb.append("' instead."); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/error/SignatureTypeMismatchException.java b/src/core/src/tonkadur/fate/v1/error/SignatureTypeMismatchException.java new file mode 100644 index 0000000..7bc47d1 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/error/SignatureTypeMismatchException.java @@ -0,0 +1,76 @@ +package tonkadur.fate.v1.error; + +import java.util.List; + +import tonkadur.error.ErrorLevel; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; + +public class SignatureTypeMismatchException extends ParsingError +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Type> given_signature; +   protected final List<Type> allowed_signature; + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   public SignatureTypeMismatchException +   ( +      final Origin call_origin, +      final List<Type> given_signature, +      final List<Type> allowed_signature +   ) +   { +      super +      ( +         ErrorLevel.FATAL, +         ErrorCategory.INVALID_USE, +         call_origin +      ); + +      this.given_signature = given_signature; +      this.allowed_signature = allowed_signature; +   } + + +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append(origin.toString()); +      sb.append(" "); +      sb.append(error_category.toString()); +      sb.append(System.lineSeparator()); + +      sb.append("Given signature:"); +      sb.append(System.lineSeparator()); + +      for (final Type t: given_signature) +      { +         sb.append("- "); +         sb.append(t.toString()); +         sb.append(System.lineSeparator()); +      } + +      sb.append(System.lineSeparator()); + +      sb.append("Expected signature:"); +      sb.append(System.lineSeparator()); + +      for (final Type t: allowed_signature) +      { +         sb.append("- "); +         sb.append(t.toString()); +         sb.append(System.lineSeparator()); +      } + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java index 82461d3..74e0fac 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java @@ -1,6 +1,7 @@  package tonkadur.fate.v1.lang.computation;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.error.ConflictingTypeException;  import tonkadur.fate.v1.error.IncomparableTypeException; @@ -42,10 +43,7 @@ public class AddElementComputation extends Computation        final Computation element,        final Computation collection     ) -   throws -      InvalidTypeException, -      ConflictingTypeException, -      IncomparableTypeException +   throws ParsingError     {        return           new AddElementComputation diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java b/src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java index 1eaed2a..4fe170f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java @@ -1,19 +1,16 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections;  import java.util.List; -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class DoWhile extends Instruction  { @@ -50,20 +47,9 @@ public class DoWhile extends Instruction        final Computation condition,        final List<Instruction> body     ) -   throws InvalidTypeException +   throws ParsingError     { -      if (!condition.get_type().get_base_type().equals(Type.BOOL)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               condition.get_origin(), -               condition.get_type(), -               Collections.singleton(Type.BOOL) -            ) -         ); -      } +      RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new DoWhile(origin, condition, body);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java index 887e08b..16d23ed 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java @@ -1,19 +1,10 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.ArrayList;  import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.functional.Merge; - -import tonkadur.error.ErrorManager; - -import tonkadur.fate.v1.error.IncompatibleTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidArityException; -  import tonkadur.fate.v1.lang.Event;  import tonkadur.fate.v1.lang.type.Type; @@ -21,6 +12,7 @@ import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class EventCall extends Instruction  { @@ -57,80 +49,14 @@ public class EventCall extends Instruction        final Event event,        final List<Computation> parameters     ) -   throws Throwable +   throws ParsingError     { -      final List<Boolean> type_checks; -      final List<Type> signature; - -      signature = event.get_signature(); - -      if (parameters.size() != signature.size()) -      { -         ErrorManager.handle -         ( -            new InvalidArityException -            ( -               origin, -               parameters.size(), -               signature.size(), -               signature.size() -            ) -         ); -      } - -      (new Merge<Type, Computation, Boolean>() -      { -         @Override -         public Boolean risky_lambda (final Type t, final Computation p) -         throws ParsingError -         { -            if ((t == null) || (p == null)) -            { -               return Boolean.FALSE; -            } -            else -            { -               final Type hint; - -               if (p.get_type().can_be_used_as(t)) -               { -                  return Boolean.TRUE; -               } - -               if (p.get_type().try_merging_with(t) != null) -               { -                  return Boolean.TRUE; -               } - -               ErrorManager.handle -               ( -                  new IncompatibleTypeException -                  ( -                     p.get_origin(), -                     p.get_type(), -                     t -                  ) -               ); - -               hint = (Type) p.get_type().generate_comparable_to(t); - -               if (hint.equals(Type.ANY)) -               { -                  ErrorManager.handle -                  ( -                     new IncomparableTypeException -                     ( -                        p.get_origin(), -                        p.get_type(), -                        t -                     ) -                  ); -               } - -               return Boolean.FALSE; -            } -         } -      }).risky_merge(signature, parameters); +      RecurrentChecks.assert_computations_matches_signature +      ( +         origin, +         parameters, +         event.get_signature() +      );        return new EventCall(origin, event, parameters);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java index d5f75b5..d81997c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java @@ -1,19 +1,11 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.ArrayList;  import java.util.Collections;  import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.error.ErrorManager; - -import tonkadur.fate.v1.error.IncompatibleTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidArityException; -import tonkadur.fate.v1.error.InvalidTypeException; -  import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.type.LambdaType;  import tonkadur.fate.v1.lang.type.CollectionType; @@ -22,6 +14,7 @@ import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class Filter extends Instruction  { @@ -58,88 +51,21 @@ public class Filter extends Instruction        final Computation lambda_function,        final Reference collection     ) -   throws Throwable +   throws ParsingError     { -      final Type var_type, collection_generic_type; -      final Type collection_out_generic_type; -      final CollectionType collection_type; -      final LambdaType lambda_type; -      final List<Type> signature; - -      var_type = lambda_function.get_type(); - -      if (!(var_type instanceof LambdaType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               origin, -               var_type, -               Collections.singleton(Type.LAMBDA) -            ) -         ); - -         return null; -      } - -      lambda_type = (LambdaType) var_type; -      signature = lambda_type.get_signature(); - -      if (signature.size() != 1) -      { -         ErrorManager.handle -         ( -            new InvalidArityException -            ( -               lambda_function.get_origin(), -               signature.size(), -               1, -               1 -            ) -         ); -      } - -      collection_generic_type = collection.get_type(); - -      if (!(collection_generic_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; -      } - -      collection_type = (CollectionType) collection_generic_type; - -      if +      RecurrentChecks.assert_is_a_collection(collection); +      RecurrentChecks.assert_lambda_matches_types        ( -         !collection_type.get_content_type().can_be_used_as(signature.get(0)) -      ) -      { -         /* TODO */ -      } - -      if (lambda_type.get_return_type().can_be_used_as(Type.BOOL)) -      { -         /* TODO */ -      } - -      return -         new Filter +         lambda_function, +         Type.BOOL, +         Collections.singletonList           ( -            origin, -            lambda_function, -            collection -         ); +            ((CollectionType) collection.get_type()).get_content_type() +         ) +      ); + +      return new Filter(origin, lambda_function, collection);     }     /**** Accessors ************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/For.java b/src/core/src/tonkadur/fate/v1/lang/instruction/For.java index 45f50b9..b6734b2 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/For.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/For.java @@ -1,19 +1,16 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections;  import java.util.List; -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class For extends Instruction  { @@ -58,20 +55,9 @@ public class For extends Instruction        final List<Instruction> body,        final Instruction post     ) -   throws InvalidTypeException +   throws ParsingError     { -      if (!condition.get_type().get_base_type().equals(Type.BOOL)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               condition.get_origin(), -               condition.get_type(), -               Collections.singleton(Type.BOOL) -            ) -         ); -      } +      RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new For(origin, condition, pre, body, post);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java index e7937f7..cd1c4d0 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java @@ -14,6 +14,7 @@ import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class ForEach extends Instruction  { diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java index 0a4f9d9..477b227 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java @@ -1,18 +1,14 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections; - -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class IfElseInstruction extends Instruction  { @@ -53,20 +49,9 @@ public class IfElseInstruction extends Instruction        final Instruction if_true,        final Instruction if_false     ) -   throws InvalidTypeException +   throws ParsingError     { -      if (!condition.get_type().get_base_type().equals(Type.BOOL)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               condition.get_origin(), -               condition.get_type(), -               Collections.singleton(Type.BOOL) -            ) -         ); -      } +      RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new IfElseInstruction(origin, condition, if_true, if_false);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java index fab144a..a8751d1 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java @@ -1,18 +1,14 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections; - -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class IfInstruction extends Instruction  { @@ -49,20 +45,9 @@ public class IfInstruction extends Instruction        final Computation condition,        final Instruction if_true     ) -   throws InvalidTypeException +   throws ParsingError     { -      if (!condition.get_type().get_base_type().equals(Type.BOOL)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               condition.get_origin(), -               condition.get_type(), -               Collections.singleton(Type.BOOL) -            ) -         ); -      } +      RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new IfInstruction(origin, condition, if_true);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java index d031559..5040987 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java @@ -1,27 +1,19 @@  package tonkadur.fate.v1.lang.instruction;  import java.util.ArrayList; -import java.util.Collections;  import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.error.ErrorManager; - -import tonkadur.fate.v1.error.IncompatibleTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidArityException; -import tonkadur.fate.v1.error.InvalidTypeException; -  import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.type.LambdaType;  import tonkadur.fate.v1.lang.type.CollectionType;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class IndexedMap extends Instruction  { @@ -64,121 +56,28 @@ public class IndexedMap extends Instruction     )     throws Throwable     { -      final Type var_type, collection_in_generic_type; -      final Type collection_out_generic_type; -      final CollectionType collection_in_type; -      final CollectionType collection_out_type; -      final LambdaType lambda_type; -      final List<Type> signature; - -      var_type = lambda_function.get_type(); - -      if (!(var_type instanceof LambdaType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               origin, -               var_type, -               Collections.singleton(Type.LAMBDA) -            ) -         ); - -         return null; -      } - -      lambda_type = (LambdaType) var_type; - -      signature = lambda_type.get_signature(); - -      if (signature.size() != 1) -      { -         ErrorManager.handle -         ( -            new InvalidArityException -            ( -               lambda_function.get_origin(), -               signature.size(), -               1, -               1 -            ) -         ); -      } - -      collection_in_generic_type = collection_in.get_type(); - -      if (!(collection_in_generic_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection_in.get_origin(), -               collection_in_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; -      } - -      collection_in_type = (CollectionType) collection_in_generic_type; - -      if -      ( -         Type.INT.can_be_used_as(signature.get(0)) -      ) -      { -         /* TODO */ -      } +      final List<Type> in_types; -      if +      in_types = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_collection(collection_in); +      RecurrentChecks.assert_is_a_collection(collection_out); + +      in_types.add(Type.INT); +      in_types.add        ( -         !collection_in_type.get_content_type().can_be_used_as(signature.get(1)) -      ) -      { -         /* TODO */ -      } - -      collection_out_generic_type = collection_out.get_type(); - -      if (!(collection_out_generic_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection_out.get_origin(), -               collection_out_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; -      } - -      collection_out_type = (CollectionType) collection_out_generic_type; - -      if +         ((CollectionType) collection_in.get_type()).get_content_type() +      ); + +      RecurrentChecks.assert_lambda_matches_types        ( -         !collection_out_type.get_content_type().can_be_used_as -         ( -            lambda_type.get_return_type() -         ) -      ) -      { -         /* TODO */ -      } +         lambda_function, +         ((CollectionType) collection_out.get_type()).get_content_type(), +         in_types +      );        return -         new IndexedMap -         ( -            origin, -            lambda_function, -            collection_in, -            collection_out -         ); +         new IndexedMap(origin, lambda_function, collection_in, collection_out);     }     /**** Accessors ************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java index 2123ee4..46a728c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java @@ -1,25 +1,19 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.ArrayList;  import java.util.Collections;  import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.error.ErrorManager; - -import tonkadur.fate.v1.error.InvalidArityException; -import tonkadur.fate.v1.error.InvalidTypeException; -  import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.type.LambdaType;  import tonkadur.fate.v1.lang.type.CollectionType;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class Map extends Instruction  { @@ -60,115 +54,21 @@ public class Map extends Instruction        final Reference collection_in,        final Reference collection_out     ) -   throws Throwable +   throws ParsingError     { -      final Type var_type, collection_in_generic_type; -      final Type collection_out_generic_type; -      final CollectionType collection_in_type; -      final CollectionType collection_out_type; -      final LambdaType lambda_type; -      final List<Type> signature; - -      var_type = lambda_function.get_type(); - -      if (!(var_type instanceof LambdaType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               origin, -               var_type, -               Collections.singleton(Type.LAMBDA) -            ) -         ); - -         return null; -      } - -      lambda_type = (LambdaType) var_type; - -      signature = lambda_type.get_signature(); - -      if (signature.size() != 1) -      { -         ErrorManager.handle -         ( -            new InvalidArityException -            ( -               lambda_function.get_origin(), -               signature.size(), -               1, -               1 -            ) -         ); -      } - -      collection_in_generic_type = collection_in.get_type(); - -      if (!(collection_in_generic_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection_in.get_origin(), -               collection_in_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; -      } - -      collection_in_type = (CollectionType) collection_in_generic_type; - -      if -      ( -         !collection_in_type.get_content_type().can_be_used_as(signature.get(0)) -      ) -      { -         /* TODO */ -      } - -      collection_out_generic_type = collection_out.get_type(); - -      if (!(collection_out_generic_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection_out.get_origin(), -               collection_out_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; -      } - -      collection_out_type = (CollectionType) collection_out_generic_type; - -      if +      RecurrentChecks.assert_is_a_collection(collection_in); +      RecurrentChecks.assert_is_a_collection(collection_out); +      RecurrentChecks.assert_lambda_matches_types        ( -         !collection_out_type.get_content_type().can_be_used_as +         lambda_function, +         ((CollectionType) collection_out.get_type()).get_content_type(), +         Collections.singletonList           ( -            lambda_type.get_return_type() +            ((CollectionType) collection_in.get_type()).get_content_type()           ) -      ) -      { -         /* TODO */ -      } +      ); -      return -         new Map -         ( -            origin, -            lambda_function, -            collection_in, -            collection_out -         ); +      return new Map(origin, lambda_function, collection_in, collection_out);     }     /**** Accessors ************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java index f2fe200..1dd9b91 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java @@ -1,27 +1,19 @@  package tonkadur.fate.v1.lang.instruction;  import java.util.ArrayList; -import java.util.Collections;  import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.error.ErrorManager; - -import tonkadur.fate.v1.error.IncompatibleTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidArityException; -import tonkadur.fate.v1.error.InvalidTypeException; -  import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.type.LambdaType;  import tonkadur.fate.v1.lang.type.CollectionType;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class Merge extends Instruction  { @@ -76,170 +68,46 @@ public class Merge extends Instruction     )     throws Throwable     { -      final Type var_type, collection_in_a_generic_type; -      final Type collection_in_b_generic_type, collection_out_generic_type; -      final CollectionType collection_in_a_type, collection_in_b_type; -      final CollectionType collection_out_type; -      final LambdaType lambda_type; -      final List<Type> signature; +      final List<Type> types_in; -      var_type = lambda_function.get_type(); +      types_in = new ArrayList<Type>(); -      if (!(var_type instanceof LambdaType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               origin, -               var_type, -               Collections.singleton(Type.LAMBDA) -            ) -         ); +      RecurrentChecks.assert_is_a_collection(collection_out); -         return null; -      } - -      lambda_type = (LambdaType) var_type; - -      signature = lambda_type.get_signature(); - -      if (signature.size() != 2) +      if (default_a == null)        { -         ErrorManager.handle -         ( -            new InvalidArityException -            ( -               lambda_function.get_origin(), -               signature.size(), -               2, -               2 -            ) -         ); +         RecurrentChecks.assert_is_a_collection(collection_in_a);        } - -      collection_in_a_generic_type = collection_in_a.get_type(); - -      if (!(collection_in_a_generic_type instanceof CollectionType)) +      else        { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection_in_a.get_origin(), -               collection_in_a_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; +         RecurrentChecks.assert_is_a_collection_of(collection_in_a, default_a);        } -      collection_in_a_type = (CollectionType) collection_in_a_generic_type; - -      if -      ( -         !collection_in_a_type.get_content_type().can_be_used_as -         ( -            signature.get(0) -         ) -      ) +      if (default_b == null)        { -         /* TODO */ +         RecurrentChecks.assert_is_a_collection(collection_in_b);        } - -      collection_in_b_generic_type = collection_in_b.get_type(); - -      if (!(collection_in_b_generic_type instanceof CollectionType)) +      else        { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection_in_b.get_origin(), -               collection_in_b_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; +         RecurrentChecks.assert_is_a_collection_of(collection_in_b, default_b);        } -      collection_in_b_type = (CollectionType) collection_in_b_generic_type; - -      if +      types_in.add        ( -         !collection_in_b_type.get_content_type().can_be_used_as -         ( -            signature.get(1) -         ) -      ) -      { -         /* TODO */ -      } +         ((CollectionType) collection_in_a.get_type()).get_content_type() +      ); -      if +      types_in.add        ( -         (default_a != null) -         && -         ( -            collection_in_a_type.get_content_type().can_be_used_as -            ( -               default_a.get_type() -            ) -         ) -      ) -      { -         /* TODO */ -      } +         ((CollectionType) collection_in_b.get_type()).get_content_type() +      ); -      if +      RecurrentChecks.assert_lambda_matches_types        ( -         (default_b != null) -         && -         ( -            collection_in_b_type.get_content_type().can_be_used_as -            ( -               default_b.get_type() -            ) -         ) -      ) -      { -         /* TODO */ -      } - -      if (collection_out != null) -      { -         collection_out_generic_type = collection_out.get_type(); - -         if (!(collection_out_generic_type instanceof CollectionType)) -         { -            ErrorManager.handle -            ( -               new InvalidTypeException -               ( -                  collection_out.get_origin(), -                  collection_out_generic_type, -                  Type.COLLECTION_TYPES -               ) -            ); - -            return null; -         } - -         collection_out_type = (CollectionType) collection_out_generic_type; - -         if -         ( -            !collection_out_type.get_content_type().can_be_used_as -            ( -               lambda_type.get_return_type() -            ) -         ) -         { -            /* TODO */ -         } -      } +         lambda_function, +         ((CollectionType) collection_out.get_type()).get_content_type(), +         types_in +      );        return           new Merge diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java index 220f345..c075c9b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java @@ -1,27 +1,18 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.ArrayList;  import java.util.Collections; -import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.error.ErrorManager; - -import tonkadur.fate.v1.error.IncompatibleTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidArityException; -import tonkadur.fate.v1.error.InvalidTypeException; -  import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.type.LambdaType;  import tonkadur.fate.v1.lang.type.CollectionType;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class Partition extends Instruction  { @@ -62,84 +53,25 @@ public class Partition extends Instruction        final Reference collection_in,        final Reference collection_out     ) -   throws Throwable +   throws ParsingError     { -      final Type var_type, collection_in_generic_type; -      final CollectionType collection_in_type; -      final LambdaType lambda_type; -      final List<Type> signature; - -      var_type = lambda_function.get_type(); - -      if (!(var_type instanceof LambdaType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               origin, -               var_type, -               Collections.singleton(Type.LAMBDA) -            ) -         ); - -         return null; -      } - -      lambda_type = (LambdaType) var_type; - -      signature = lambda_type.get_signature(); - -      if (signature.size() != 1) -      { -         ErrorManager.handle -         ( -            new InvalidArityException -            ( -               lambda_function.get_origin(), -               signature.size(), -               1, -               1 -            ) -         ); -      } - -      collection_in_generic_type = collection_in.get_type(); - -      if (!(collection_in_generic_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection_in.get_origin(), -               collection_in_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; -      } - -      collection_in_type = (CollectionType) collection_in_generic_type; +      RecurrentChecks.assert_is_a_collection(collection_in); +      RecurrentChecks.assert_is_a_collection(collection_out); +      RecurrentChecks.assert_can_be_used_as +      ( +         collection_in, +         collection_out.get_type() +      ); -      if +      RecurrentChecks.assert_lambda_matches_types        ( -         !collection_in_type.get_content_type().can_be_used_as(signature.get(0)) -      ) -      { -         /* TODO */ -      } - -      if (lambda_type.get_return_type().can_be_used_as(Type.BOOL)) -      { -         /* TODO */ -      } - -      if (!collection_in_type.can_be_used_as(collection_out.get_type())) -      { -         /* TODO */ -      } +         lambda_function, +         Type.BOOL, +         Collections.singletonList +         ( +            ((CollectionType) collection_in.get_type()).get_content_type() +         ) +      );        return           new Partition diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java index 7729164..9ea468f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java @@ -1,17 +1,12 @@  package tonkadur.fate.v1.lang.instruction; -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; - -import tonkadur.fate.v1.lang.type.CollectionType; -import tonkadur.fate.v1.lang.type.Type; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class PopElement extends Instruction  { @@ -48,26 +43,9 @@ public class PopElement extends Instruction        final Computation collection,        final boolean is_from_left     ) -   throws InvalidTypeException +   throws ParsingError     { -      if -      ( -         !Type.COLLECTION_TYPES.contains -         ( -            collection.get_type().get_act_as_type() -         ) -      ) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection.get_type(), -               Type.COLLECTION_TYPES -            ) -         ); -      } +      RecurrentChecks.assert_is_a_collection(collection);        return new PopElement(origin, collection, is_from_left);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java index ae28617..8c76365 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java @@ -1,18 +1,15 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections; - -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.PointerType;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class PromptInteger extends Instruction  { @@ -57,46 +54,16 @@ public class PromptInteger extends Instruction        final Computation max,        final Computation label     ) -   throws InvalidTypeException +   throws ParsingError     { -      if (!target.get_type().can_be_used_as(Type.INT)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               target.get_origin(), -               target.get_type(), -               Collections.singletonList(Type.INT) -            ) -         ); -      } - -      if (!min.get_type().can_be_used_as(Type.INT)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               min.get_origin(), -               min.get_type(), -               Collections.singletonList(Type.INT) -            ) -         ); -      } - -      if (!max.get_type().can_be_used_as(Type.INT)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               min.get_origin(), -               min.get_type(), -               Collections.singletonList(Type.INT) -            ) -         ); -      } +      RecurrentChecks.assert_can_be_used_as(min, Type.INT); +      RecurrentChecks.assert_can_be_used_as(max, Type.INT); +      RecurrentChecks.assert_can_be_used_as(label, Type.RICH_TEXT); +      RecurrentChecks.assert_can_be_used_as +      ( +         target, +         new PointerType(origin, Type.INT, "auto generated") +      );        return new PromptInteger(origin, target, min, max, label);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java index e857952..a0a8a42 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java @@ -1,18 +1,15 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections; - -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.PointerType;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class PromptString extends Instruction  { @@ -57,46 +54,16 @@ public class PromptString extends Instruction        final Computation max,        final Computation label     ) -   throws InvalidTypeException +   throws ParsingError     { -      if (!target.get_type().can_be_used_as(Type.STRING)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               target.get_origin(), -               target.get_type(), -               Collections.singletonList(Type.STRING) -            ) -         ); -      } - -      if (!min.get_type().can_be_used_as(Type.INT)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               min.get_origin(), -               min.get_type(), -               Collections.singletonList(Type.INT) -            ) -         ); -      } - -      if (!max.get_type().can_be_used_as(Type.INT)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               min.get_origin(), -               min.get_type(), -               Collections.singletonList(Type.INT) -            ) -         ); -      } +      RecurrentChecks.assert_can_be_used_as(min, Type.INT); +      RecurrentChecks.assert_can_be_used_as(max, Type.INT); +      RecurrentChecks.assert_can_be_used_as(label, Type.RICH_TEXT); +      RecurrentChecks.assert_can_be_used_as +      ( +         target, +         new PointerType(origin, Type.STRING, "auto generated") +      );        return new PromptString(origin, target, min, max, label);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java index 8f0474a..0ab34d4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java @@ -1,21 +1,12 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections; - -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.ConflictingTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidTypeException; - -import tonkadur.fate.v1.lang.type.CollectionType; -import tonkadur.fate.v1.lang.type.Type; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class PushElement extends Instruction  { @@ -56,86 +47,9 @@ public class PushElement extends Instruction        final Computation collection,        final boolean is_from_left     ) -   throws -      InvalidTypeException, -      ConflictingTypeException, -      IncomparableTypeException +   throws ParsingError     { -      final Type hint; -      final Type collection_type; -      final CollectionType collection_true_type; -      final Type collection_element_type; - -      collection_type = collection.get_type(); - -      if (!(collection_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection.get_type(), -               Collections.singletonList(Type.LIST) -            ) -         ); -      } - -      collection_true_type = (CollectionType) collection_type; - -      if (collection_true_type.is_set()) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection.get_type(), -               Collections.singletonList(Type.LIST) -            ) -         ); -      } - -      collection_element_type = collection_true_type.get_content_type(); - -      if -      ( -         element.get_type().can_be_used_as(collection_element_type) -         || -         (element.get_type().try_merging_with(collection_element_type) != null) -      ) -      { -         return new PushElement(origin, element, collection, is_from_left); -      } - -      ErrorManager.handle -      ( -         new ConflictingTypeException -         ( -            element.get_origin(), -            element.get_type(), -            collection_element_type -         ) -      ); - -      hint = -         (Type) element.get_type().generate_comparable_to -         ( -            collection_element_type -         ); - -      if (hint.equals(Type.ANY)) -      { -         ErrorManager.handle -         ( -            new IncomparableTypeException -            ( -               element.get_origin(), -               element.get_type(), -               collection_element_type -            ) -         ); -      } +      RecurrentChecks.assert_is_a_list_of(collection, element);        return new PushElement(origin, element, collection, is_from_left);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java index acce7d0..b8ef9de 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java @@ -1,20 +1,13 @@  package tonkadur.fate.v1.lang.instruction; -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.ConflictingTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidTypeException; - -import tonkadur.fate.v1.lang.type.CollectionType; -import tonkadur.fate.v1.lang.type.Type; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class RemoveAllOfElement extends Instruction  { @@ -51,72 +44,9 @@ public class RemoveAllOfElement extends Instruction        final Computation element,        final Reference collection     ) -   throws -      InvalidTypeException, -      ConflictingTypeException, -      IncomparableTypeException +   throws ParsingError     { -      final Type hint; -      final Type collection_type; -      final CollectionType collection_true_type; -      final Type collection_element_type; - -      collection_type = collection.get_type(); - -      if (!(collection_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection.get_type(), -               Type.COLLECTION_TYPES -            ) -         ); -      } - -      collection_true_type = (CollectionType) collection_type; -      collection_element_type = collection_true_type.get_content_type(); - -      if -      ( -         element.get_type().can_be_used_as(collection_element_type) -         || -         (element.get_type().try_merging_with(collection_element_type) != null) -      ) -      { -         return new RemoveAllOfElement(origin, element, collection); -      } - -      ErrorManager.handle -      ( -         new ConflictingTypeException -         ( -            element.get_origin(), -            element.get_type(), -            collection_element_type -         ) -      ); - -      hint = -         (Type) element.get_type().generate_comparable_to -         ( -            collection_element_type -         ); - -      if (hint.equals(Type.ANY)) -      { -         ErrorManager.handle -         ( -            new IncomparableTypeException -            ( -               element.get_origin(), -               element.get_type(), -               collection_element_type -            ) -         ); -      } +      RecurrentChecks.assert_is_a_collection_of(collection, element);        return new RemoveAllOfElement(origin, element, collection);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java index d721614..ac4d093 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java @@ -1,19 +1,12 @@  package tonkadur.fate.v1.lang.instruction; -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.ConflictingTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidTypeException; - -import tonkadur.fate.v1.lang.type.CollectionType; -import tonkadur.fate.v1.lang.type.Type; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class RemoveElement extends Instruction  { @@ -50,72 +43,9 @@ public class RemoveElement extends Instruction        final Computation element,        final Computation collection     ) -   throws -      InvalidTypeException, -      ConflictingTypeException, -      IncomparableTypeException +   throws ParsingError     { -      final Type hint; -      final Type collection_type; -      final CollectionType collection_true_type; -      final Type collection_element_type; - -      collection_type = collection.get_type(); - -      if (!(collection_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection.get_type(), -               Type.COLLECTION_TYPES -            ) -         ); -      } - -      collection_true_type = (CollectionType) collection_type; -      collection_element_type = collection_true_type.get_content_type(); - -      if -      ( -         element.get_type().can_be_used_as(collection_element_type) -         || -         (element.get_type().try_merging_with(collection_element_type) != null) -      ) -      { -         return new RemoveElement(origin, element, collection); -      } - -      ErrorManager.handle -      ( -         new ConflictingTypeException -         ( -            element.get_origin(), -            element.get_type(), -            collection_element_type -         ) -      ); - -      hint = -         (Type) element.get_type().generate_comparable_to -         ( -            collection_element_type -         ); - -      if (hint.equals(Type.ANY)) -      { -         ErrorManager.handle -         ( -            new IncomparableTypeException -            ( -               element.get_origin(), -               element.get_type(), -               collection_element_type -            ) -         ); -      } +      RecurrentChecks.assert_is_a_collection_of(collection, element);        return new RemoveElement(origin, element, collection);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java index 3bf0104..750dafe 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java @@ -1,19 +1,15 @@  package tonkadur.fate.v1.lang.instruction; -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidTypeException; - -import tonkadur.fate.v1.lang.type.CollectionType;  import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class RemoveElementAt extends Instruction  { @@ -50,47 +46,10 @@ public class RemoveElementAt extends Instruction        final Computation index,        final Reference collection     ) -   throws -      InvalidTypeException, -      IncomparableTypeException +   throws ParsingError     { -      final Type collection_type, hint; - -      collection_type = collection.get_type(); - -      if (!(collection_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection.get_type(), -               Type.COLLECTION_TYPES -            ) -         ); -      } - -      if (index.get_type().can_be_used_as(Type.INT)) -      { -         return new RemoveElementAt(origin, index, collection); -      } - -      hint = -         (Type) index.get_type().generate_comparable_to(Type.INT); - -      if (hint.equals(Type.ANY)) -      { -         ErrorManager.handle -         ( -            new IncomparableTypeException -            ( -               index.get_origin(), -               index.get_type(), -               Type.INT -            ) -         ); -      } +      RecurrentChecks.assert_is_a_collection(collection); +      RecurrentChecks.assert_can_be_used_as(index, Type.INT);        return new RemoveElementAt(origin, index, collection);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java index 59a68e6..9d84ee4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java @@ -1,19 +1,12 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections; - -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; - -import tonkadur.fate.v1.lang.type.CollectionType; -import tonkadur.fate.v1.lang.type.Type; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class ReverseList extends Instruction  { @@ -46,28 +39,9 @@ public class ReverseList extends Instruction        final Origin origin,        final Computation collection     ) -   throws InvalidTypeException +   throws ParsingError     { -      final Type t; - -      t = collection.get_type(); - -      if -      ( -         !(t instanceof CollectionType) -         || ((CollectionType) t).is_set() -      ) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection.get_type(), -               Collections.singleton(Type.LIST) -            ) -         ); -      } +      RecurrentChecks.assert_is_a_list(collection);        return new ReverseList(origin, collection);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java index 6a7db6f..5983c03 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java @@ -1,18 +1,13 @@  package tonkadur.fate.v1.lang.instruction; -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; -import tonkadur.fate.v1.error.ConflictingTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidTypeException; - -import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class SetValue extends Instruction  { @@ -49,55 +44,9 @@ public class SetValue extends Instruction        final Computation element,        final Computation value_reference     ) -   throws -      InvalidTypeException, -      ConflictingTypeException, -      IncomparableTypeException +   throws ParsingError     { -      final Type hint; -      final Type value_reference_type; - -      value_reference_type = value_reference.get_type(); - -      if -      ( -         element.get_type().can_be_used_as(value_reference_type) -         || -         (element.get_type().try_merging_with(value_reference_type) != null) -      ) -      { -         return new SetValue(origin, element, value_reference); -      } - - -      ErrorManager.handle -      ( -         new ConflictingTypeException -         ( -            element.get_origin(), -            element.get_type(), -            value_reference_type -         ) -      ); - -      hint = -         (Type) element.get_type().generate_comparable_to -         ( -            value_reference_type -         ); - -      if (hint.equals(Type.ANY)) -      { -         ErrorManager.handle -         ( -            new IncomparableTypeException -            ( -               element.get_origin(), -               element.get_type(), -               value_reference_type -            ) -         ); -      } +      RecurrentChecks.assert_can_be_used_as(element, value_reference);        return new SetValue(origin, element, value_reference);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java index ebac30e..82e746d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java @@ -1,19 +1,14 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections; -  import tonkadur.error.ErrorManager;  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; - -import tonkadur.fate.v1.lang.type.CollectionType; -import tonkadur.fate.v1.lang.type.Type; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class Shuffle extends Instruction  { @@ -46,28 +41,9 @@ public class Shuffle extends Instruction        final Origin origin,        final Computation collection     ) -   throws InvalidTypeException +   throws ParsingError     { -      final Type t; - -      t = collection.get_type(); - -      if -      ( -         !(t instanceof CollectionType) -         || ((CollectionType) t).is_set() -      ) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection.get_type(), -               Collections.singleton(Type.LIST) -            ) -         ); -      } +      RecurrentChecks.assert_is_a_list(collection);        return new Shuffle(origin, collection);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java index d9f3397..083b1a1 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java @@ -1,27 +1,19 @@  package tonkadur.fate.v1.lang.instruction;  import java.util.ArrayList; -import java.util.Collections;  import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.error.ErrorManager; - -import tonkadur.fate.v1.error.IncompatibleTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidArityException; -import tonkadur.fate.v1.error.InvalidTypeException; -  import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.type.LambdaType;  import tonkadur.fate.v1.lang.type.CollectionType;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class Sort extends Instruction  { @@ -60,79 +52,21 @@ public class Sort extends Instruction     )     throws Throwable     { -      final Type var_type, collection_generic_type; -      final CollectionType collection_type; -      final LambdaType lambda_type; -      final List<Type> signature; - -      var_type = lambda_function.get_type(); - -      if (!(var_type instanceof LambdaType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               origin, -               var_type, -               Collections.singleton(Type.LAMBDA) -            ) -         ); - -         return null; -      } - -      lambda_type = (LambdaType) var_type; - -      signature = lambda_type.get_signature(); - -      if (signature.size() != 2) -      { -         ErrorManager.handle -         ( -            new InvalidArityException -            ( -               lambda_function.get_origin(), -               signature.size(), -               1, -               1 -            ) -         ); -      } - -      collection_generic_type = collection.get_type(); - -      if (!(collection_generic_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection.get_origin(), -               collection_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; -      } - -      collection_type = (CollectionType) collection_generic_type; - -      if (!collection_type.get_content_type().can_be_used_as(signature.get(0))) -      { -         /* TODO */ -      } - -      if (!collection_type.get_content_type().can_be_used_as(signature.get(1))) -      { -         /* TODO */ -      } - -      if (!lambda_type.get_return_type().can_be_used_as(Type.INT)) -      { -         /* TODO */ -      } +      final List<Type> types_in; + +      types_in = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_list(collection); + +      types_in.add(((CollectionType) collection.get_type()).get_content_type()); +      types_in.add(types_in.get(0)); + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         Type.INT, +         types_in +      );        return new Sort(origin, lambda_function, collection);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java index 607f7c1..918d6e0 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java @@ -1,26 +1,15 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.error.ErrorManager; - -import tonkadur.fate.v1.error.IncompatibleTypeException; -import tonkadur.fate.v1.error.IncomparableTypeException; -import tonkadur.fate.v1.error.InvalidArityException; -import tonkadur.fate.v1.error.InvalidTypeException; -  import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.type.CollectionType;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Reference; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class SubList extends Instruction  { @@ -67,29 +56,15 @@ public class SubList extends Instruction     )     throws Throwable     { -      final Type collection_generic_type; - -      collection_generic_type = collection_in.get_type(); - -      if (!(collection_generic_type instanceof CollectionType)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               collection_in.get_origin(), -               collection_generic_type, -               Type.COLLECTION_TYPES -            ) -         ); - -         return null; -      } - -      if (!collection_generic_type.can_be_used_as(collection_out.get_type())) -      { -         /* TODO */ -      } +      RecurrentChecks.assert_is_a_collection(collection_in); +      RecurrentChecks.assert_is_a_collection(collection_out); +      RecurrentChecks.assert_can_be_used_as +      ( +         collection_in, +         collection_out.get_type() +      ); +      RecurrentChecks.assert_can_be_used_as(start, Type.INT); +      RecurrentChecks.assert_can_be_used_as(end, Type.INT);        return new SubList(origin, start, end, collection_in, collection_out);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java index b67dc42..6c0b021 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java @@ -1,21 +1,18 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections;  import java.util.List; -import tonkadur.error.ErrorManager; -  import tonkadur.functional.Cons;  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class SwitchInstruction extends Instruction  { @@ -56,7 +53,7 @@ public class SwitchInstruction extends Instruction        final List<Cons<Computation, Instruction>> branches,        final Instruction default_instruction     ) -   throws InvalidTypeException +   throws ParsingError     {        final Type target_type; @@ -64,21 +61,11 @@ public class SwitchInstruction extends Instruction        for (final Cons<Computation, Instruction> branch: branches)        { -         if (!branch.get_car().get_type().get_base_type().equals(target_type)) -         { -            ErrorManager.handle -            ( -               new InvalidTypeException -               ( -                  branch.get_car().get_origin(), -                  branch.get_car().get_type(), -                  Collections.singleton(target_type) -               ) -            ); -         } +         RecurrentChecks.assert_can_be_used_as(branch.get_car(), Type.BOOL);        } -      return new SwitchInstruction(origin, target, branches, default_instruction); +      return +         new SwitchInstruction(origin, target, branches, default_instruction);     }     /**** Accessors ************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/While.java b/src/core/src/tonkadur/fate/v1/lang/instruction/While.java index 6c70025..b29b496 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/While.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/While.java @@ -1,19 +1,16 @@  package tonkadur.fate.v1.lang.instruction; -import java.util.Collections;  import java.util.List; -import tonkadur.error.ErrorManager; -  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class While extends Instruction  { @@ -50,20 +47,9 @@ public class While extends Instruction        final Computation condition,        final List<Instruction> body     ) -   throws InvalidTypeException +   throws ParsingError     { -      if (!condition.get_type().get_base_type().equals(Type.BOOL)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               condition.get_origin(), -               condition.get_type(), -               Collections.singleton(Type.BOOL) -            ) -         ); -      } +      RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new While(origin, condition, body);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java b/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java index da9c233..52fe607 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java @@ -1,17 +1,24 @@  package tonkadur.fate.v1.lang.meta;  import java.util.Collections; +import java.util.List;  import tonkadur.error.ErrorManager; +import tonkadur.functional.Merge; +  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.error.ConflictingTypeException;  import tonkadur.fate.v1.error.IncomparableTypeException;  import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.fate.v1.error.InvalidArityException; +import tonkadur.fate.v1.error.SignatureTypeMismatchException; +import tonkadur.fate.v1.error.IncorrectReturnTypeException;  import tonkadur.fate.v1.lang.type.CollectionType; +import tonkadur.fate.v1.lang.type.LambdaType;  import tonkadur.fate.v1.lang.type.Type;  public class RecurrentChecks @@ -246,4 +253,188 @@ public class RecurrentChecks           ((CollectionType) c).get_content_type()        );     } + +   public static void assert_computations_matches_signature +   ( +      final Origin o, +      final List<Computation> c, +      final List<Type> t +   ) +   throws ParsingError +   { +      if (c.size() != t.size()) +      { +         ErrorManager.handle +         ( +            new InvalidArityException +            ( +               o, +               c.size(), +               t.size(), +               t.size() +            ) +         ); +      } + +      try +      { +         (new Merge<Type, Computation, Boolean>() +         { +            @Override +            public Boolean risky_lambda (final Type t, final Computation p) +            throws ParsingError +            { +               assert_can_be_used_as(p, t); + +               return Boolean.TRUE; +            } +         }).risky_merge(t, c); +      } +      catch (final ParsingError pe) +      { +         throw pe; +      } +      catch (final Throwable e) +      { +         e.printStackTrace(); +         System.exit(-1); +      } +   } + +   public static void assert_types_matches_signature +   ( +      final Origin o, +      final List<Type> c, +      final List<Type> t +   ) +   throws ParsingError +   { +      if (c.size() != t.size()) +      { +         ErrorManager.handle +         ( +            new InvalidArityException +            ( +               o, +               c.size(), +               t.size(), +               t.size() +            ) +         ); +      } + +      try +      { +         (new Merge<Type, Type, Boolean>() +         { +            @Override +            public Boolean risky_lambda (final Type t, final Type p) +            throws ParsingError +            { +               assert_can_be_used_as(o, p, t); + +               return Boolean.TRUE; +            } +         }).risky_merge(t, c); +      } +      catch (final ParsingError e) +      { +         System.err.println(e.toString()); + +         ErrorManager.handle +         ( +            new SignatureTypeMismatchException(o, c, t) +         ); +      } +      catch (final Throwable e) +      { +         e.printStackTrace(); +         System.exit(-1); +      } +   } + +   public static void assert_is_a_lambda_function (final Computation l) +   throws ParsingError +   { +      if (!(l.get_type() instanceof LambdaType)) +      { +         ErrorManager.handle +         ( +            new InvalidTypeException +            ( +               l.get_origin(), +               l.get_type(), +               Collections.singleton(Type.LAMBDA) +            ) +         ); +      } +   } + +   public static void assert_return_type_is +   ( +      final Computation l, +      final Type r +   ) +   throws ParsingError +   { +      try +      { +         assert_can_be_used_as +         ( +            l.get_origin(), +            ((LambdaType) l.get_type()).get_return_type(), +            r +         ); +      } +      catch (final ParsingError e) +      { +         System.err.println(e.toString()); + +         ErrorManager.handle +         ( +            new IncorrectReturnTypeException +            ( +               l.get_origin(), +               ((LambdaType) l.get_type()).get_return_type(), +               r +            ) +         ); +      } +   } + +   public static void assert_lambda_matches_computations +   ( +      final Computation l, +      final Type r, +      final List<Computation> c +   ) +   throws ParsingError +   { +      assert_is_a_lambda_function(l); +      assert_return_type_is(l, r); +      assert_computations_matches_signature +      ( +         l.get_origin(), +         c, +         ((LambdaType) l.get_type()).get_signature() +      ); +   } + +   public static void assert_lambda_matches_types +   ( +      final Computation l, +      final Type r, +      final List<Type> c +   ) +   throws ParsingError +   { +      assert_is_a_lambda_function(l); +      assert_return_type_is(l, r); +      assert_types_matches_signature +      ( +         l.get_origin(), +         c, +         ((LambdaType) l.get_type()).get_signature() +      ); +   }  } | 


