| summaryrefslogtreecommitdiff |
diff options
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() + ); + } } |


