summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-13 10:46:38 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-13 10:46:38 +0200
commita18c6292ba435f13c968c71ae40ff921c69e5042 (patch)
tree45b985e6053fc9d28285469fe0b1fbb5c30456cd /src
parent18581bcbd25bd48c54f41755a51444923c903db8 (diff)
Cleans up instruction building asserts.
Diffstat (limited to 'src')
-rw-r--r--src/core/src/tonkadur/fate/v1/error/IncorrectReturnTypeException.java60
-rw-r--r--src/core/src/tonkadur/fate/v1/error/SignatureTypeMismatchException.java76
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java22
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java90
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java98
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/For.java22
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java23
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java23
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java137
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Map.java122
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java178
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java102
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java30
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java57
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java57
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java94
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java78
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java78
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java51
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java34
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java59
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java98
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java45
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java25
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/While.java22
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java191
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()
+ );
+ }
}