]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
Merge remote-tracking branch 'origin/svn' 19/19/1
authorHannu Niemistö <hannu.niemisto@semantum.fi>
Mon, 15 Aug 2016 11:19:15 +0000 (14:19 +0300)
committerHannu Niemistö <hannu.niemisto@semantum.fi>
Mon, 15 Aug 2016 11:19:15 +0000 (14:19 +0300)
Change-Id: I478743179fe637965255b3ed1d7d03c0fc0c54ab

211 files changed:
bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependenciesRelation.java
bundles/org.simantics.scl.compiler/src/org/cojen/classfile/MethodDesc.java
bundles/org.simantics.scl.compiler/src/org/cojen/classfile/TypeDesc.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/CommandSession.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/commands/ValueToStringConverter.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/DocumentationGeneration.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NameExistenceChecks.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/NamespaceOfModule.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeChecking.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingOld.java [deleted file]
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingScheduler.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeInferableDefinition.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalBoxedArrayElementConstant.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/LocalVariableConstant.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/generic/ClassRef.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/SimplificationContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TranslationContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TypeTranslationContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TypingContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/equation/EqGuard.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ASTExpression.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Case.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/DecoratingExpression.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EAmbiguous.java [new file with mode: 0644]
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApply.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApplyType.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EAsPattern.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBind.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EConstant.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EEnforce.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EEntityTypeAnnotation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EEquations.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EError.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EExternalConstant.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EFieldAccess.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EGetConstraint.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EIf.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EIntegerLiteral.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELambda.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELambdaType.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELet.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EListComprehension.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EListLiteral.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELiteral.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EMatch.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EPreLet.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EPreRuleset.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERealLiteral.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERecord.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERuleset.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESelect.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLambda.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLet.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETransformation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETypeAnnotation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EVariable.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EWhen.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Expression.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ExpressionTransformer.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/GuardedExpressionGroup.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/StandardExpressionTransformer.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/ExpressionAccessor.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/FieldAccessor.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/block/GuardStatement.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListAssignment.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGenerator.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGuard.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListQualifier.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListThen.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/printing/ExpressionToStringVisitor.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/MinigraphModule.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/macros/StandardMacroRule.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClass.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/modules/TypeClassInstance.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractCombiner.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAbstractModifier.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QAtom.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QConjunction.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QDisjunction.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QExists.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QMapping.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/QNegation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/Query.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ConstraintCollectionContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/DynamicProgrammingOrdering.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/compilation/ExpressionConstraint.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/query/pre/PreQuery.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/LocalRelation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/SCLRelation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/relations/TransitiveClosureRelation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/rules/TransformationRule.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/AbstractLocalEnvironment.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/ConcreteEnvironment.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/EmptyNamespace.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Environments.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/LocalEnvironment.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/Namespace.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceImpl.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/NamespaceSpec.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/filter/NamespaceFilters.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/errors/CompilationErrorFormatter.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/LoopAnalysis.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/analysis/StatementBrowser.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/optimization/OptimizationMap.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/BoundVar.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/Val.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/Throw.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetFunctions.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ClassBuilder.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/CopyContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/PrintingContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SCLContextPreparationStep.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/SSAValidationContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/CodeWriter.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/deriving/InstanceDerivers.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSet.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintSolver.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/InstanceTree.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintSolver.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints2/ConstraintStore.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/matching/PatternMatchingCompiler.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/profiling/BranchPointInjector.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/subsumption/SubSolver.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/DecomposedRule.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/TransformationBuilder.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/UnifiableFactory.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/declarations/DRuleAst.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/translation/RelationRepository.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeElaborationContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeHashCodeContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/effects/EffectIdMap.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HierarchicalDocumentationRef.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/SCLDocumentationExtensionNodeHandler.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Entities.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/inlines/Subject.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/HtmlEscape.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/MarkdownParser.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/internal/Scanner.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/LazyModule.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepositories.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/ExpressionClassLoader.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/MutableClassLoader.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeEnvironmentImpl.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModuleMap.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/ClassModuleSource.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ClassModuleSourceRepository.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/FileModuleSourceRepository.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/MapModuleSourceRepository.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ModuleSourceRepository.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionInterpretationContext.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/SCLCompilerConfiguration.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Skeletons.java [new file with mode: 0644]
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TApply.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TCon.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TForAll.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TFun.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TMetaVar.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TPred.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TUnion.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/TVar.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Type.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Types.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeListener.java [new file with mode: 0644]
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeTree.java [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/ActiveTests.java
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FindAllowedChars.java [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FutureTests.java [deleted file]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/ModuleRegressionTests.java [moved from bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/RegressionTestsWithoutPrelude.java with 51% similarity]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/RegressionTests.java
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/RegressionTestsWithPrelude.java [deleted file]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/TestBase.java
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/TestClassNaming.java
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/TestExpressionEvaluator.java
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/TestTypeDesc.java [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/UnimplementedTests.java
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Deriving1.scl [deleted file]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/DifferentBranchTypes.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Formula.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable1.scl [deleted file]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable2.scl [deleted file]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/InvalidLambda.scl
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Matching3b.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/MatchingWithMissingParameter.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading1.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading2.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading3.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/RecordShorthand.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Seq.scl [deleted file]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/StringEscape.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/UnexpectedToken.scl
bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/unit/TestNamespaceFilter.java
bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java
bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleTestScriptRunnable.java
bundles/org.simantics.scl.runtime/META-INF/MANIFEST.MF
bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/Lists.java
bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/SCLContext.java
bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/equations/TestEquationContext.java
bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/exceptions/MatchingException.java [new file with mode: 0644]
bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/io/SclIO.java
bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/minigraph/Minigraph.java
bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/unification/UMapUtils.java
bundles/winterwell.markdown/.project

index 965ca6ee489131e437448c54f40adce09167e012..d3c44903b3c05235c41e3c40ec357b064fdf1008 100644 (file)
@@ -405,10 +405,10 @@ public class DependenciesRelation extends UnsupportedRelation implements Generic
                                            if (parent != null) {\r
                                                _additions.add(new Object[] { ss.getRandomAccessId(parent), ss.getRandomAccessId(entry.component), name, types, id != null ? id.indexString() : "" });\r
                                            } else {\r
-                                                   System.err.println("resource " + entry.component + ": no parent for entry " + name + " " + types);\r
+                                                   //System.err.println("resource " + entry.component + ": no parent for entry " + name + " " + types);\r
                                            }\r
                                        } else {\r
-                                           System.err.println("resource " + entry.component + ": " + name + " " + types);\r
+                                           //System.err.println("resource " + entry.component + ": " + name + " " + types);\r
                                        }\r
                                    } else if(_entry instanceof ComponentModification) {\r
                                        ComponentModification entry = (ComponentModification)_entry;\r
index e9547699238991920ac5406956cad1e020b85e35..6a751c5b5a1ac1cffbe04c0550989dd1e1de71c1 100644 (file)
 
 package org.cojen.classfile;
 
-import java.io.Serializable;
 import java.io.Externalizable;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
 import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.ObjectStreamException;
+import java.io.Serializable;
 import java.lang.reflect.Method;
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 
 import org.cojen.util.WeakCanonicalSet;
 
index 084eb3dc85445cef536d561c0eec6cf6d1c2e002..cfc5a1deb0fcf7a303651c39782af93fc6e8742b 100644 (file)
 package org.cojen.classfile;
 
 import java.io.Serializable;
-import java.io.Externalizable;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.ObjectStreamException;
 import java.lang.ref.SoftReference;
 import java.lang.reflect.Array;
 import java.util.Collections;
@@ -510,10 +505,6 @@ public abstract class TypeDesc extends Descriptor implements Serializable {
         return false;
     }
 
-    Object writeReplace() throws ObjectStreamException {
-        return new External(mDescriptor);
-    }
-
     private static class PrimitiveType extends TypeDesc {
         private transient final int mCode;
         private transient TypeDesc mArrayType;
@@ -895,27 +886,4 @@ public abstract class TypeDesc extends Descriptor implements Serializable {
             }
         }
     }
-
-    private static class External implements Externalizable {
-        private String mDescriptor;
-
-        public External() {
-        }
-
-        public External(String desc) {
-            mDescriptor = desc;
-        }
-
-        public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeUTF(mDescriptor);
-        }
-
-        public void readExternal(ObjectInput in) throws IOException {
-            mDescriptor = in.readUTF();
-        }
-
-        public Object readResolve() throws ObjectStreamException {
-            return forDescriptor(mDescriptor);
-        }
-    }
 }
index 8ad47b0a093d9b6ebeecc121e603cf4e0ffaa6f7..e463a4e6a4ca420c8308e405c4dc0017dd321d8c 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.commands;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectProcedure;
-import gnu.trove.set.hash.THashSet;
-
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -62,6 +58,10 @@ import org.simantics.scl.runtime.reporting.SCLReporting;
 import org.simantics.scl.runtime.reporting.SCLReportingHandler;
 import org.simantics.scl.runtime.tuple.Tuple0;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectProcedure;
+import gnu.trove.set.hash.THashSet;
+
 
 public class CommandSession {
 
index 07ca39015fb4f363f1d1f8484ece89ebbb5fb12f..51d5c456fcaf3e8690a5e9499cf08487fdfad762 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.commands;
 
-import gnu.trove.map.hash.THashMap;
-
 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
 import org.simantics.scl.compiler.top.ExpressionEvaluator;
 import org.simantics.scl.compiler.top.SCLExpressionCompilationException;
@@ -9,6 +7,8 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.runtime.function.Function1;
 
+import gnu.trove.map.hash.THashMap;
+
 public class ValueToStringConverter {
     final RuntimeEnvironment environment;
     final THashMap<Type, Function1> showInstances = new THashMap<Type, Function1>(); 
index 91215886255e02c05d25f7b43835afa2cdb4c29f..0ad3627d89f5337ace03301b0d9e470eddcb4169 100644 (file)
@@ -1,9 +1,9 @@
 package org.simantics.scl.compiler.compilation;\r
 \r
-import gnu.trove.map.hash.TObjectLongHashMap;\r
-\r
 import java.util.ArrayList;\r
 \r
+import gnu.trove.map.hash.TObjectLongHashMap;\r
+\r
 public class CompilationTimer {\r
     private long initialTime, previousTime;\r
     private ArrayList<TimerEntry> entries = new ArrayList<TimerEntry>();\r
index e4124d9b79559a9c862386133d55bff50af14d55..b242431806efc334f6fd463f9dbcaa8eba48a8df 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.compilation;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
@@ -13,6 +10,9 @@ import org.simantics.scl.compiler.internal.parsing.declarations.DDocumentationAs
 import org.simantics.scl.compiler.module.ConcreteModule;
 import org.simantics.scl.compiler.types.TCon;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 public class DocumentationGeneration {
     THashMap<String, DDocumentationAst> valueDocumentation;
     THashMap<String, DDocumentationAst> typeDocumentation;
index dc3bdc9e852c901acb0b0a360de15aedb15f8cd8..d331283fd76f3ddfd624f65a4fc7c03e288379a5 100644 (file)
@@ -1,7 +1,6 @@
 package org.simantics.scl.compiler.compilation;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
index 8204b5f604bea380e30625f97d8d77af70ebf47a..1f45c5f41a9d88c8345686e70fcd8b4834dd37ff 100644 (file)
@@ -5,22 +5,27 @@ import org.simantics.scl.compiler.elaboration.modules.TypeConstructor;
 import org.simantics.scl.compiler.environment.AmbiguousNameException;\r
 import org.simantics.scl.compiler.environment.Environment;\r
 import org.simantics.scl.compiler.errors.ErrorLog;\r
+import org.simantics.scl.compiler.top.SCLCompilerConfiguration;\r
 \r
 public class NameExistenceChecks {\r
     public static void checkIfValueExists(ErrorLog errorLog, long location,\r
             Environment environment, String name) {\r
-        try {\r
-            SCLValue value = environment.getLocalNamespace().getValue(name);\r
-            if(value != null)\r
+        if(SCLCompilerConfiguration.ALLOW_OVERLOADING)\r
+            return;\r
+        else {\r
+            try {\r
+                SCLValue value = environment.getLocalNamespace().getValue(name);\r
+                if(value != null)\r
+                    errorLog.log(location,\r
+                            "Value " + name + " is already defined in the module " + \r
+                                    value.getName().module + \r
+                            " that is imported to the default namespace.");\r
+            } catch(AmbiguousNameException e) {\r
                 errorLog.log(location,\r
-                        "Value " + name + " is already defined in the module " + \r
-                                value.getName().module + \r
-                        " that is imported to the default namespace.");\r
-        } catch(AmbiguousNameException e) {\r
-            errorLog.log(location,\r
-                    "Value " + name + " is already defined in the modules " + \r
-                            e.conflictingModules[0] + " and  " + e.conflictingModules[1] +  \r
-                    " that are imported to the default namespace.");\r
+                        "Value " + name + " is already defined in the modules " + \r
+                                e.conflictingModules[0] + " and  " + e.conflictingModules[1] +  \r
+                        " that are imported to the default namespace.");\r
+            }\r
         }\r
     }\r
     \r
index 7b2ee618f5dcf87d2becb248eb49c4e9b8ac6dda..8ade1602e23e730ba4e37227eb5ef09dd861eb7c 100644 (file)
@@ -1,7 +1,6 @@
 package org.simantics.scl.compiler.compilation;
 
-import gnu.trove.procedure.TObjectProcedure;
-
+import java.util.Arrays;
 import java.util.function.Consumer;
 
 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
@@ -18,8 +17,11 @@ import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter;
 import org.simantics.scl.compiler.environment.filter.NamespaceFilter;
 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
 import org.simantics.scl.compiler.module.Module;
+import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
 import org.simantics.scl.compiler.types.TCon;
 
+import gnu.trove.procedure.TObjectProcedure;
+
 public class NamespaceOfModule implements Namespace {
     private final Namespace base;
     private final Module module;
@@ -37,9 +39,30 @@ public class NamespaceOfModule implements Namespace {
     @Override
     public SCLValue getValue(String name) throws AmbiguousNameException {
         SCLValue value = module.getValue(name);
+        if(SCLCompilerConfiguration.ALLOW_OVERLOADING) {
+            SCLValue value2;
+            try {
+                value2 = base.getValue(name);
+            } catch(AmbiguousNameException e) {
+                if(value != null) {
+                    String[] conflictingModules = Arrays.copyOf(e.conflictingModules, e.conflictingModules.length+1);
+                    conflictingModules[e.conflictingModules.length] = module.getName();
+                    throw new AmbiguousNameException(Arrays.asList(conflictingModules), e.name);
+                }
+                else
+                    throw e;
+            }
+            if(value == null)
+                return value2;
+            if(value2 == null)
+                return value;
+            throw new AmbiguousNameException(Arrays.asList(value.getName().module, value2.getName().module), value.getName().name);
+        }
+        else {
         if(value != null)
             return value;
         return base.getValue(name);
+        }
     }
 
     @Override
index 97266d6e9781e16d2c5d77ba4d0107b80f8ee251..554a360811b69b2312151b9c4f8fe503d131c790 100644 (file)
@@ -5,16 +5,13 @@ import static org.simantics.scl.compiler.elaboration.expressions.Expressions.app
 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.lambda;
 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.loc;
 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.vars;
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
+import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous;
 import org.simantics.scl.compiler.elaboration.expressions.EPlaceholder;
 import org.simantics.scl.compiler.elaboration.expressions.ETransformation;
 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
@@ -42,6 +39,11 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Polarity;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
 public class TypeChecking {
     final ErrorLog errorLog;
     final Environment environment;
@@ -97,6 +99,8 @@ public class TypeChecking {
                             context.pushEffectUpperBound(expression.location, Types.PROC);
                             expression = expression.checkType(context, value.getType());
                             context.popEffectUpperBound();
+                            for(EAmbiguous overloaded : context.overloadedExpressions)
+                                overloaded.assertResolved(errorLog);
                             value.setExpression(expression);
                             
                             ArrayList<EVariable> constraintDemand = context.getConstraintDemand();
@@ -199,6 +203,7 @@ public class TypeChecking {
                         @Override
                         public void run() {
                             Type type = value.getType();
+
                             Expression expression = value.getExpression();
 
                             try {
@@ -211,6 +216,8 @@ public class TypeChecking {
                                 context.pushEffectUpperBound(expression.location, Types.PROC);
                                 expression = expression.checkType(context, type);
                                 context.popEffectUpperBound();
+                                for(EAmbiguous overloaded : context.overloadedExpressions)
+                                    overloaded.assertResolved(errorLog);
                                 expression.getType().addPolarity(Polarity.POSITIVE);
                                 context.solveSubsumptions(expression.getLocation());
                                 ArrayList<EVariable> demands = context.getConstraintDemand();
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingOld.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/TypeCheckingOld.java
deleted file mode 100644 (file)
index c5ef573..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-package org.simantics.scl.compiler.compilation;
-
-import static org.simantics.scl.compiler.elaboration.expressions.Expressions.apply;
-import static org.simantics.scl.compiler.elaboration.expressions.Expressions.applyTypes;
-import static org.simantics.scl.compiler.elaboration.expressions.Expressions.lambda;
-import static org.simantics.scl.compiler.elaboration.expressions.Expressions.loc;
-import static org.simantics.scl.compiler.elaboration.expressions.Expressions.vars;
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
-import java.util.ArrayList;
-
-import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
-import org.simantics.scl.compiler.elaboration.expressions.EPlaceholder;
-import org.simantics.scl.compiler.elaboration.expressions.EVariable;
-import org.simantics.scl.compiler.elaboration.expressions.Expression;
-import org.simantics.scl.compiler.elaboration.expressions.Variable;
-import org.simantics.scl.compiler.elaboration.modules.SCLValue;
-import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
-import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
-import org.simantics.scl.compiler.environment.Environment;
-import org.simantics.scl.compiler.errors.ErrorLog;
-import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.constraints.Constraint;
-import org.simantics.scl.compiler.internal.elaboration.constraints.ConstraintEnvironment;
-import org.simantics.scl.compiler.internal.elaboration.constraints.ConstraintSolver;
-import org.simantics.scl.compiler.internal.elaboration.constraints.ExpressionAugmentation;
-import org.simantics.scl.compiler.internal.elaboration.constraints.ReducedConstraints;
-import org.simantics.scl.compiler.internal.elaboration.utils.StronglyConnectedComponents;
-import org.simantics.scl.compiler.module.ConcreteModule;
-import org.simantics.scl.compiler.types.TPred;
-import org.simantics.scl.compiler.types.TVar;
-import org.simantics.scl.compiler.types.Type;
-import org.simantics.scl.compiler.types.Types;
-import org.simantics.scl.compiler.types.kinds.Kinds;
-import org.simantics.scl.compiler.types.util.Polarity;
-
-public class TypeCheckingOld {
-    public static final boolean PRINT_VALUES = false;
-    
-    ErrorLog errorLog;
-    Environment environment;
-    ConcreteModule module;
-    
-    ConstraintEnvironment ce;
-    ArrayList<SCLValue[]> valuesWithoutTypeAnnotation = new ArrayList<SCLValue[]>(); 
-    ArrayList<SCLValue> valuesWithTypeAnnotation = new ArrayList<SCLValue>();
-    
-    public TypeCheckingOld(ErrorLog errorLog, Environment environment,
-            ConcreteModule module) {
-        this.errorLog = errorLog;
-        this.environment = environment;
-        this.module = module;
-    }
-    
-    public void typeCheck() {
-        ce = new ConstraintEnvironment(environment);
-        groupValueDefinitionsByDependency();
-        typeCheckValuesWithoutTypeAnnotations();
-        typeCheckValuesWithTypeAnnotations();
-        typeCheckRules();
-    }
-
-    private void groupValueDefinitionsByDependency() {
-        // Collect all untyped names
-        final ArrayList<SCLValue> values = new ArrayList<SCLValue>();
-        for(SCLValue value : module.getValues()) {
-            if(value.getExpression() != null) {
-                if(value.getType() == null)
-                    values.add(value);
-                else
-                    valuesWithTypeAnnotation.add(value);   
-            }            
-        }
-        
-        // Create inverse
-        final TObjectIntHashMap<Object> allRefs = 
-                new TObjectIntHashMap<Object>(values.size()*2, 0.5f, -1);
-        for(int i=0;i<values.size();++i)
-            allRefs.put(values.get(i), i);
-        
-        // Create groups       
-        new StronglyConnectedComponents(values.size()) {
-            
-            TIntHashSet set = new TIntHashSet();
-            
-            @Override
-            protected void reportComponent(int[] component) {
-                SCLValue[] valueComponent = new SCLValue[component.length];
-                for(int i=0;i<component.length;++i)
-                    valueComponent[i] = values.get(component[i]);
-                valuesWithoutTypeAnnotation.add(valueComponent);
-            }
-            
-            @Override
-            protected int[] findDependencies(int u) {
-                Expression expression = values.get(u).getExpression();
-                expression.collectRefs(allRefs, set);
-                
-                int[] result = set.toArray();
-                set.clear();
-                
-                return result;
-            }
-            
-        }.findComponents();
-    }
-    
-    private void typeCheckValuesWithoutTypeAnnotations() {
-        for(SCLValue[] group : valuesWithoutTypeAnnotation) {
-            if(PRINT_VALUES) {
-                System.out.println("---------------------------------------------");
-                System.out.print("---");
-                for(SCLValue value : group)
-                    System.out.print(" " + value.getName());
-                System.out.println();
-            }
-            
-            for(int i=0;i<group.length;++i)
-                group[i].setType(Types.metaVar(Kinds.STAR));
-            
-            TypingContext context = new TypingContext(errorLog, environment);
-            context.recursiveValues = new THashSet<SCLValue>();
-            for(SCLValue value : group)
-                context.recursiveValues.add(value);
-                    
-            @SuppressWarnings("unchecked")
-            ArrayList<EVariable>[] constraintDemands = new ArrayList[group.length];
-            
-            @SuppressWarnings("unchecked")
-            ArrayList<EPlaceholder>[] recursiveReferences = new ArrayList[group.length];
-            for(int i=0;i<group.length;++i) {
-                context.recursiveReferences = new ArrayList<EPlaceholder>();
-                
-                SCLValue value = group[i];
-                Expression expression = value.getExpression();
-                expression = expression.checkType(context, value.getType());
-                value.setExpression(expression);
-                
-                ArrayList<EVariable> constraintDemand = context.getConstraintDemand();
-                if(!constraintDemand.isEmpty()) {
-                    constraintDemands[i] = constraintDemand;
-                    context.resetConstraintDemand();
-                }
-                
-                recursiveReferences[i] = context.recursiveReferences;
-            }
-
-            for(Type type : Types.getTypes(group))
-                type.addPolarity(Polarity.POSITIVE);
-            context.solveSubsumptions(group[0].getExpression().getLocation());
-            ArrayList<Constraint> allUnsolvedConstraints = new ArrayList<Constraint>(); 
-            
-            @SuppressWarnings("unchecked")
-            ArrayList<Variable>[] freeEvidence = new ArrayList[group.length];  
-            for(int i=0;i<group.length;++i) {
-                if(constraintDemands[i] != null) {
-                    SCLValue value = group[i];
-                    Expression expression = value.getExpression();
-                    
-                    ReducedConstraints red = ConstraintSolver.solve(
-                            ce, new ArrayList<TPred>(0), constraintDemands[i],
-                            true /*!Types.isFunction(expression.getType())*/);                                        
-                    
-                    expression = ExpressionAugmentation.augmentSolved(
-                            red.solvedConstraints, 
-                            expression);
-                    value.setExpression(expression);
-                    value.setType(expression.getType());
-                    
-                    for(Constraint c : red.unsolvedConstraints)
-                        if(c.constraint.isGround()) {
-                            errorLog.log(c.getDemandLocation(), "There is no instance for <"+c.constraint+">.");
-                        }          
-                    
-                    ArrayList<Variable> fe = new ArrayList<Variable>(red.unsolvedConstraints.size());
-                    for(Constraint c : red.unsolvedConstraints) {
-                        allUnsolvedConstraints.add(c);
-                        fe.add(c.evidence);
-                    }
-                    freeEvidence[i] = fe;
-                }
-                else {
-                    group[i].setExpression(group[i].getExpression().decomposeMatching());
-                    freeEvidence[i] = new ArrayList<Variable>(0);
-                }
-            }
-
-            THashSet<TVar> varSet = new THashSet<TVar>(); 
-            for(int i=0;i<group.length;++i) {
-                SCLValue value = group[i];
-                Type type = value.getType();
-                type = type.convertMetaVarsToVars();
-                value.setType(type);
-                varSet.addAll(Types.freeVars(type));
-            }
-            
-            TVar[] vars = varSet.toArray(new TVar[varSet.size()]);
-            
-            // Collect all constraints needed in the group
-            THashSet<TPred> constraintSet = new THashSet<TPred>();
-            for(int i=0;i<group.length;++i) {
-                for(Variable evidence : freeEvidence[i]) {
-                    constraintSet.add((TPred)evidence.getType());
-                }
-            }
-            TPred[] constraints = constraintSet.toArray(new TPred[constraintSet.size()]);
-            for(TPred constraint : constraints)
-                if(constraint.containsMetaVars()) {
-                    for(Constraint c : allUnsolvedConstraints) {
-                        if(Types.equals(c.constraint, constraint)) {
-                            errorLog.log(c.getDemandLocation(), 
-                                    "Constrain " + constraint + 
-                                    " contains free variables not mentioned in the type of the value.");
-                            break;
-                        }
-                    }
-                }
-
-
-            // TODO copy to TypeChecking2 from this onwards
-            for(int i=0;i<group.length;++i) {                
-                // Create evidence array of every value in the group that has the variables
-                // in the same array as in the shared array
-                ArrayList<Variable> fe = freeEvidence[i];
-                THashMap<TPred, Variable> indexedEvidence = new THashMap<TPred, Variable>(fe.size());
-                for(Variable v : fe)
-                    indexedEvidence.put((TPred)v.getType(), v);
-                fe.clear();
-                for(TPred c : constraints) {
-                    Variable var = indexedEvidence.get(c);
-                    if(var == null) {
-                        // These are variables that are not directly needed in 
-                        // this definition but in the definitions that are
-                        // recursively called
-                        var = new Variable("evX");
-                        var.setType(c);
-                        fe.add(var);
-                    }
-                    fe.add(var);
-                }
-                
-                // Add evidence parameters to the functions
-                SCLValue value = group[i];
-                value.setExpression(lambda(Types.NO_EFFECTS, fe, value.getExpression())
-                        .closure(vars));
-                value.setType(Types.forAll(vars, 
-                        Types.constrained(constraints, value.getType())));
-                
-                // Add evidence parameters to recursive calls
-                for(EPlaceholder ref : recursiveReferences[i]) {
-                    ref.expression = loc(ref.expression.location, apply(
-                            Types.NO_EFFECTS,
-                            applyTypes(ref.expression, vars),
-                            vars(fe)));
-                }
-            }
-        }
-    }
-    
-    private void typeCheckValuesWithTypeAnnotations() {
-        ArrayList<TPred> givenConstraints = new ArrayList<TPred>();
-        for(SCLValue value : valuesWithTypeAnnotation) {            
-            Type type = value.getType();
-            if(type != null) {
-                if(PRINT_VALUES) {
-                    System.out.println("---------------------------------------------");
-                    System.out.println("--- " + value.getName() + " :: " + type);
-                }
-                Expression expression = value.getExpression();
-                ArrayList<TVar> vars = new ArrayList<TVar>();
-                type = Types.removeForAll(type, vars);                
-                type = Types.removePred(type, givenConstraints);
-                
-                /*System.out.println("---------------------------------------------");
-                TypeUnparsingContext tuc = new TypeUnparsingContext();
-                System.out.println("--- " + value.getName() + " :: " + type.toString(tuc));
-                for(TPred t : givenConstraints)
-                    System.out.println(">>> " + t.toString(tuc));
-                */
-                TypingContext context = new TypingContext(errorLog, environment);
-                //System.out.println(expression);
-                expression = expression.checkType(context, type);
-                //System.out.println(expression);
-                expression.getType().addPolarity(Polarity.POSITIVE);
-                context.solveSubsumptions(expression.getLocation());
-                ArrayList<EVariable> demands = context.getConstraintDemand();
-                if(!demands.isEmpty() || !givenConstraints.isEmpty()) {
-                    ReducedConstraints red = 
-                            ConstraintSolver.solve(ce, givenConstraints, demands, true);    
-                    givenConstraints.clear();
-                    for(Constraint c :  red.unsolvedConstraints) {
-                        errorLog.log(c.getDemandLocation(), 
-                                "Constraint <"+c.constraint+"> is not given and cannot be derived.");
-                    }
-                    if(errorLog.isEmpty()) { // To prevent exceptions
-                        expression = ExpressionAugmentation.augmentSolved(
-                                red.solvedConstraints,
-                                expression);
-                        expression = ExpressionAugmentation.augmentUnsolved(
-                                red.givenConstraints, 
-                                expression); 
-                    }
-                }
-                else {
-                    if(errorLog.isEmpty()) // To prevent exceptions
-                        expression = expression.decomposeMatching();
-                }
-                expression = expression.closure(vars.toArray(new TVar[vars.size()]));
-                value.setExpression(expression);
-            }
-        }
-    }
-
-    public void typeCheckRules() {
-        TypingContext context = new TypingContext(errorLog, environment);
-        for(TransformationRule rule : module.getRules()) {
-            context.pushEffectUpperBound(rule.location, Types.metaVar(Kinds.EFFECT));
-            rule.checkType(context);
-            rule.setEffect(Types.canonical(context.popEffectUpperBound()));
-        }
-        context.solveSubsumptions(Locations.NO_LOCATION);
-        
-        ArrayList<EVariable> demands = context.getConstraintDemand();
-        if(!demands.isEmpty()) {
-            ReducedConstraints red = 
-                    ConstraintSolver.solve(ce, new ArrayList<TPred>(), demands, true);
-            for(Constraint c :  red.unsolvedConstraints) {
-                errorLog.log(c.getDemandLocation(), 
-                        "Constraint <"+c.constraint+"> is not given and cannot be derived.");
-            }
-        }
-        
-        for(MappingRelation mappingRelation : module.getMappingRelations())
-            for(Type parameterType : mappingRelation.parameterTypes)
-                if(!parameterType.isGround()) {
-                    errorLog.log(mappingRelation.location, "Parameter types of the mapping relation are not completely determined.");
-                    break;
-                }
-        
-        /*for(Rule rule : module.getRules()) {
-            System.out.println(rule.name);
-            for(Variable variable : rule.variables)
-                System.out.println("    " + variable.getName() + " :: " + variable.getType());
-        }*/
-    }
-}
index c3fb2dda7076d74f0e9924e8eed00197e950f557..cb6752527605e5dc9c1d659515c2272234cd3aa9 100644 (file)
@@ -1,11 +1,5 @@
 package org.simantics.scl.compiler.compilation;
 
-import gnu.trove.impl.Constants;
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
@@ -18,6 +12,12 @@ import org.simantics.scl.compiler.internal.elaboration.utils.StronglyConnectedCo
 import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.TVar;
 
+import gnu.trove.impl.Constants;
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
 /**
  * Schedules the order of type checking.
  * 
index 34c6c1b85189fca05dff5536f094f4439370bf2c..17b165d7f2312ebf64aba4ffde902426b15b8d22 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.compilation;
 
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
 import java.util.ArrayList;
 import java.util.Collection;
 
@@ -13,6 +9,10 @@ import org.simantics.scl.compiler.internal.elaboration.constraints.Constraint;
 import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.TVar;
 
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
 public interface TypeInferableDefinition {
     long getLocation();
     Collection<Object> getDefinedObjects();
index a26ee9d750dbc3493f3345e6ab1433f5e14c9cc8..b7114a441e57a674de875efa81a529c6aaa5178b 100644 (file)
@@ -1,7 +1,7 @@
 package org.simantics.scl.compiler.constants;
 
-import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable;
 import org.cojen.classfile.TypeDesc;
+import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable;
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
 import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;
 import org.simantics.scl.compiler.types.Type;
index 782f34e390d475eae7a2c442ffc21f1166ac21f6..7de438d151e57844f05c9c065435870ed6f129c7 100644 (file)
@@ -1,7 +1,7 @@
 package org.simantics.scl.compiler.constants;
 
-import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable;
 import org.cojen.classfile.TypeDesc;
+import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable;
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
 import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;
 import org.simantics.scl.compiler.types.Type;
index 5686d63400b231afd9de38cc1b647edc962124fc..2ff26cf2dc5d5132259de6b317153af7382f4983 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.constants.generic;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -20,6 +18,8 @@ import org.simantics.scl.compiler.constants.generic.MethodRef.StaticFieldRef;
 import org.simantics.scl.compiler.constants.generic.MethodRef.StaticMethodRef;
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilderBase;
 
+import gnu.trove.map.hash.THashMap;
+
 /**
  * This class is a reference to a Java class that contains a map of MethodRef for each
  * method declared by the referenced class.
index e983e1277e0a93f27ab0964e3083ecf588583531..90e93f3d00a014b6de9d1dc13e5f0bffe05f4ecd 100755 (executable)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.elaboration.contexts;
 
-import gnu.trove.list.array.TLongArrayList;
-import gnu.trove.map.hash.THashMap;
-
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.common.names.Name;
 import org.simantics.scl.compiler.constants.Constant;
@@ -30,6 +27,9 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
 import org.simantics.scl.compiler.types.util.MultiFunction;
 
+import gnu.trove.list.array.TLongArrayList;
+import gnu.trove.map.hash.THashMap;
+
 public class SimplificationContext implements EnvironmentalContext {
     Environment environment;
     ErrorLog errorLog;
index 961fa902b9db552469b998f2e30e8255f806dcc1..b5f9f93e942cb17bcf21c411d7e37702244bd415 100644 (file)
@@ -1,10 +1,5 @@
 package org.simantics.scl.compiler.elaboration.contexts;
 
-import gnu.trove.list.array.TIntArrayList;
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectProcedure;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 
@@ -12,6 +7,7 @@ import org.simantics.scl.compiler.common.names.Name;
 import org.simantics.scl.compiler.common.precedence.Associativity;
 import org.simantics.scl.compiler.common.precedence.Precedence;
 import org.simantics.scl.compiler.elaboration.expressions.Case;
+import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous;
 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
 import org.simantics.scl.compiler.elaboration.expressions.EEntityTypeAnnotation;
 import org.simantics.scl.compiler.elaboration.expressions.EError;
@@ -36,6 +32,13 @@ import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter;
 import org.simantics.scl.compiler.errors.ErrorLog;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.parsing.declarations.DValueAst;
+import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
+import org.simantics.scl.compiler.types.Type;
+
+import gnu.trove.list.array.TIntArrayList;
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectProcedure;
+import gnu.trove.set.hash.THashSet;
 
 public class TranslationContext extends TypeTranslationContext implements EnvironmentalContext {
 
@@ -147,7 +150,45 @@ public class TranslationContext extends TypeTranslationContext implements Enviro
     }
     
     private Expression resolveIn(long location, Namespace namespace, String name) {
-        SCLValue value = resolveValueIn(location, namespace, name);
+        SCLValue value;
+        try {
+            value = resolveValueIn(location, namespace, name);
+        } catch (AmbiguousNameException e) {
+            if(SCLCompilerConfiguration.ALLOW_OVERLOADING) {
+                EAmbiguous.Alternative[] alternatives = new EAmbiguous.Alternative[e.conflictingModules.length];
+                //System.out.println("Overloading:");
+                for(int i=0;i<e.conflictingModules.length;++i) {
+                    Name altName = Name.create(e.conflictingModules[i], e.name);
+                    //System.out.println("    " + altName);
+                    SCLValue altValue = environment.getValue(altName);
+                    alternatives[i] = new EAmbiguous.Alternative() {
+                        @Override
+                        public Type getType() {
+                            return altValue.getType();
+                        }
+    
+                        @Override
+                        public Expression realize() {
+                            EConstant expression = new EConstant(altValue);
+                            expression.location = location;
+                            return expression;
+                        }
+                        
+                        @Override
+                        public String toString() {
+                            return altValue.getName().toString().replace('/', '.');
+                        }
+                    };
+                }
+                EAmbiguous expression = new EAmbiguous(alternatives);
+                expression.location = location;
+                return expression;
+            }
+            else {
+                errorLog.log(location, e.getMessage());
+                value = null;
+            }
+        }
         if(value == null)
             return new EError(location);
         return new EConstant(location, value);
@@ -340,8 +381,7 @@ public class TranslationContext extends TypeTranslationContext implements Enviro
             return prec;
     }
 
-    private SCLValue resolveValueIn(long location, Namespace namespace, final String name) {
-        try {
+    private SCLValue resolveValueIn(long location, Namespace namespace, final String name) throws AmbiguousNameException {
             SCLValue value = namespace.getValue(name);
             if(value == null) {
                 StringBuilder message = new StringBuilder();
@@ -391,10 +431,6 @@ public class TranslationContext extends TypeTranslationContext implements Enviro
                 return null;
             }
             return value;
-        } catch (AmbiguousNameException e) {
-            errorLog.log(location, e.getMessage());
-            return null;
-        }
     }
     
     public Case translateCase(Expression lhs, Expression rhs) {        
index 29b9028e6d721e6a21d1f5e5d9d998c41762e35b..b9dbb4be823b1e3d7c1bb769073c91f7bbe654c3 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.elaboration.contexts;
 
-import gnu.trove.map.hash.THashMap;
-
 import org.simantics.scl.compiler.environment.Environment;
 import org.simantics.scl.compiler.errors.ErrorLog;
 import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
@@ -15,6 +13,8 @@ import org.simantics.scl.compiler.types.exceptions.KindUnificationException;
 import org.simantics.scl.compiler.types.kinds.Kind;
 import org.simantics.scl.compiler.types.kinds.Kinds;
 
+import gnu.trove.map.hash.THashMap;
+
 public class TypeTranslationContext {
     
     Environment environment;
index de58a05cdb6c7838d02f4a108a77ac4127b98444..850f077db32d3ec9c8b81a2ebe5b4f6b32b30aa6 100644 (file)
@@ -1,13 +1,11 @@
 package org.simantics.scl.compiler.elaboration.contexts;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.common.names.Name;
 import org.simantics.scl.compiler.constants.NoRepConstant;
+import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous;
 import org.simantics.scl.compiler.elaboration.expressions.EApply;
 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
 import org.simantics.scl.compiler.elaboration.expressions.EError;
@@ -41,6 +39,9 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException;
 import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 public class TypingContext implements EnvironmentalContext {
 
     private ErrorLog errorLog;
@@ -64,6 +65,9 @@ public class TypingContext implements EnvironmentalContext {
     public THashSet<SCLValue> recursiveValues;
     public ArrayList<EPlaceholder> recursiveReferences;
     
+    // Overloading
+    public ArrayList<EAmbiguous> overloadedExpressions = new ArrayList<EAmbiguous>(); 
+    
     //TypeUnparsingContext tuc = new TypeUnparsingContext();   
     
     Environment environment;
@@ -258,7 +262,7 @@ public class TypingContext implements EnvironmentalContext {
      * Instantiates type abstractions and constraints from the value.
      */
     public Expression instantiate(Expression expr) {
-        Type type = Types.weakCanonical(expr.getType());
+        Type type = Types.canonical(expr.getType());
         while(type instanceof TForAll) {
             TForAll forAll = (TForAll)type;
             TVar var = forAll.var;
@@ -297,7 +301,7 @@ public class TypingContext implements EnvironmentalContext {
      * type applications, lambdas and effect subsumptions.
      */
     public Expression subsume(Expression expr, Type b) {
-        b = Types.weakCanonical(b);
+        b = Types.canonical(b);
         /*if(b instanceof TForAll) {
             TForAll forAll = (TForAll)b;
             TVar var = forAll.var;
index c753924e64eb7fc5e99576e2e6fa2e4c13200475..8b24943478792887543d9a6cc363ff63fe1281b7 100644 (file)
@@ -56,7 +56,7 @@ public class EqGuard extends Equation {
 \r
     @Override\r
     public void checkType(TypingContext context) {\r
-        guard = guard.inferType(context);\r
+        guard = guard.checkIgnoredType(context);\r
     }\r
 \r
     @Override\r
index aeeb1ec1ea8c4ce80b4ff052d695e5c50d8d0bba..af0a43d0896c495f31b0c1d9280ff46dc4dce483 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -11,6 +7,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public abstract class ASTExpression extends SimplifiableExpression {\r
     public ASTExpression() {\r
     }\r
index 219cce461a10adb586c484a3713a546152e7772c..50eda1c130d6840475875276a71f011760ce53ce 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -13,6 +9,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator
 import org.simantics.scl.compiler.internal.parsing.Symbol;\r
 import org.simantics.scl.compiler.types.Type;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class Case extends Symbol {\r
     public Expression[] patterns;\r
     public Expression value;\r
@@ -99,6 +99,17 @@ public class Case extends Symbol {
             patterns[i] = patterns[i].checkTypeAsPattern(context, parameterTypes[i]);\r
         value = value.checkType(context, requiredType);\r
     }\r
+    \r
+    public void checkIgnoredType(TypingContext context, Type[] parameterTypes) {\r
+        if(patterns.length != parameterTypes.length) {\r
+            context.getErrorLog().log(location, "This case has different arity ("+patterns.length+\r
+                    ") than than the first case (+"+parameterTypes.length+"+).");\r
+            return;\r
+        }\r
+        for(int i=0;i<patterns.length;++i)\r
+            patterns[i] = patterns[i].checkTypeAsPattern(context, parameterTypes[i]);\r
+        value = value.checkIgnoredType(context);\r
+    }\r
         \r
     public void decorate(ExpressionDecorator decorator) {\r
         for(int i=0;i<patterns.length;++i)\r
index 224bd17b96979e6d64b0e761fb0b42b90f2715f8..95b18efd62abd266e90af0b7a6237172899302d2 100644 (file)
@@ -128,4 +128,10 @@ public abstract class DecoratingExpression extends SimplifiableExpression {
         expression = expression.checkBasicType(context, requiredType);
         return this;
     }
+    
+    @Override
+    public Expression checkIgnoredType(TypingContext context) {
+        expression = expression.checkIgnoredType(context);
+        return this;
+    }
 }
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EAmbiguous.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EAmbiguous.java
new file mode 100644 (file)
index 0000000..6121a57
--- /dev/null
@@ -0,0 +1,227 @@
+package org.simantics.scl.compiler.elaboration.expressions;
+
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
+import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
+import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
+import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
+import org.simantics.scl.compiler.errors.ErrorLog;
+import org.simantics.scl.compiler.errors.Locations;
+import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
+import org.simantics.scl.compiler.types.Skeletons;
+import org.simantics.scl.compiler.types.TMetaVar;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.exceptions.MatchException;
+import org.simantics.scl.compiler.types.exceptions.UnificationException;
+import org.simantics.scl.compiler.types.util.TypeListener;
+import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
+
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
+public class EAmbiguous extends SimplifiableExpression {
+    public static final boolean DEBUG = false;
+    
+    Alternative[] alternatives;
+    boolean[] active;
+    int activeCount;
+    transient TypingContext context;
+    Expression resolvedExpression;
+    
+    public abstract static class Alternative {
+        public abstract Type getType();
+        public abstract Expression realize();
+    }
+    
+    public EAmbiguous(Alternative[] alternatives) {
+        this.alternatives = alternatives;
+        this.active = new boolean[alternatives.length];
+        for(int i=0;i<alternatives.length;++i)
+            this.active[i] = true;
+        this.activeCount = alternatives.length;
+    }
+
+    @Override
+    public void collectRefs(TObjectIntHashMap<Object> allRefs,
+            TIntHashSet refs) {
+    }
+
+    @Override
+    public void collectVars(TObjectIntHashMap<Variable> allVars,
+            TIntHashSet vars) {
+    }
+
+    @Override
+    public void forVariables(VariableProcedure procedure) {
+    }
+
+    @Override
+    protected void updateType() throws MatchException {
+        throw new InternalCompilerError();
+    }
+    
+    private Type getCommonSkeleton() {
+        Type[] types = new Type[activeCount];
+        for(int i=0,j=0;i<alternatives.length;++i)
+            if(active[i])
+                types[j++] = Types.instantiateAndStrip(alternatives[i].getType());
+        return Skeletons.commonSkeleton(context.getEnvironment(), types);
+    }
+
+    private void filterActive() {
+        THashMap<TMetaVar,Type> unifications = new THashMap<TMetaVar,Type>(); 
+        Type requiredType = getType();
+        if(DEBUG)
+            System.out.println("EAmbigious.filterActive with " + requiredType);
+        for(int i=0;i<alternatives.length;++i)
+            if(active[i]) {
+                unifications.clear();
+                Type alternativeType = Types.instantiateAndStrip(alternatives[i].getType());
+                if(DEBUG)
+                    System.out.println("    " + alternativeType);
+                if(!Skeletons.areSkeletonsCompatible(unifications, alternativeType, requiredType)) {
+                    active[i] = false;
+                    --activeCount;
+                }
+            }
+        if(DEBUG)
+            System.out.println("    activeCount = " + activeCount);
+    }
+
+    private String getNoMatchDescription(Type requiredType) {
+        StringBuilder b = new StringBuilder();
+        b.append("Expected <");
+        requiredType.toString(new TypeUnparsingContext(), b);
+        b.append(">, but no alteratives match the type: ");
+        for(int i=0;i<alternatives.length;++i) {
+            b.append("\n    ");
+            b.append(alternatives[i]);
+            b.append(" :: ");
+            alternatives[i].getType().toString(new TypeUnparsingContext(), b);
+        }
+        b.append('.');
+        return b.toString();
+    }
+    
+    private String getAmbiguousDescription(Type requiredType) {
+        StringBuilder b = new StringBuilder();
+        b.append("Expected <");
+        requiredType.toString(new TypeUnparsingContext(), b);
+        b.append(">, but multiple values match the type: ");
+        for(int i=0;i<alternatives.length;++i) {
+            b.append("\n    ");
+            b.append(alternatives[i]);
+            b.append(" :: ");
+            alternatives[i].getType().toString(new TypeUnparsingContext(), b);
+        }
+        b.append('.');
+        return b.toString();
+    }
+
+
+    private void resolveTo(int i) {
+        if(DEBUG)
+            System.out.println("EAmbigious.resolve to " + alternatives[i]);
+        resolvedExpression = context.instantiate(alternatives[i].realize());
+        Type requiredType = getType();
+        try {
+            Types.unify(resolvedExpression.getType(), requiredType);
+        } catch (UnificationException e) {
+            context.getErrorLog().log(location, getNoMatchDescription(requiredType));
+        }
+    }
+    
+    private void listenType() {
+        if(DEBUG)
+            System.out.println("EAmbigious.listenType " + getType());
+        new TypeListener() {
+            @Override
+            public void notifyAboutChange() {
+                if(DEBUG)
+                    System.out.println("EAmbigious.notifyAboutChange " + getType());
+                Type requiredType = getType();
+                filterActive();
+                if(activeCount == 0) {
+                    context.getErrorLog().log(location, getNoMatchDescription(requiredType));
+                    return;
+                }   
+                else if(activeCount == 1) {
+                    for(int i=0;i<alternatives.length;++i)
+                        if(active[i]) {
+                            resolveTo(i);
+                            return;
+                        }
+                }
+                Type commonType = getCommonSkeleton();
+                try {
+                    Skeletons.unifySkeletons(requiredType, commonType);
+                    listenType();
+                } catch (UnificationException e) {
+                    context.getErrorLog().log(location, getNoMatchDescription(requiredType));
+                }
+            }
+        }.listenSkeleton(getType());
+    }
+    
+    @Override
+    public Expression inferType(TypingContext context) {
+        this.context = context;
+        context.overloadedExpressions.add(this);
+        setType(getCommonSkeleton());
+        listenType();
+        return this;
+    }
+    
+    @Override
+    public void collectFreeVariables(THashSet<Variable> vars) {
+    }
+
+    @Override
+    public Expression resolve(TranslationContext context) {
+        throw new InternalCompilerError("EAmbiguousConstant should not exist in resolve phase.");
+    }
+
+    @Override
+    public void setLocationDeep(long loc) {
+        if(location == Locations.NO_LOCATION)
+            location = loc;
+    }
+
+    @Override
+    public Expression decorate(ExpressionDecorator decorator) {
+        return this;
+    }
+
+    @Override
+    public void collectEffects(THashSet<Type> effects) {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    public void accept(ExpressionVisitor visitor) {
+        // TODO Auto-generated method stub
+    }
+    
+    @Override
+    public Expression simplify(SimplificationContext context) {
+        if(resolvedExpression != null)
+            return resolvedExpression;
+        else {
+            context.getErrorLog().log(location, getAmbiguousDescription(getType()));
+            return this;
+        }
+    }
+    
+    public void assertResolved(ErrorLog errorLog) {
+        if(resolvedExpression == null)
+            errorLog.log(location, getAmbiguousDescription(getType()));
+    }
+    
+    @Override
+    public Expression accept(ExpressionTransformer transformer) {
+        return transformer.transform(this);
+    }
+
+}
index fb27b9198afbf00ef9b6ae9b08eac1585eabbe97..8df327362560bc8574eefc96542d9e6f4da4de4a 100755 (executable)
@@ -1,12 +1,9 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.names.Name;\r
+import org.simantics.scl.compiler.constants.NoRepConstant;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -26,6 +23,8 @@ import org.simantics.scl.compiler.internal.interpreted.IApply;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;\r
 import org.simantics.scl.compiler.internal.interpreted.IListLiteral;\r
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;\r
+import org.simantics.scl.compiler.types.Skeletons;\r
+import org.simantics.scl.compiler.types.TFun;\r
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
@@ -33,6 +32,10 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException;
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 import org.simantics.scl.compiler.types.util.MultiFunction;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EApply extends Expression {\r
     Expression function;\r
     Expression[] parameters;\r
@@ -248,8 +251,7 @@ public class EApply extends Expression {
         return new IApply(function.toIExpression(target), parametersI);\r
     }\r
     \r
-    @Override\r
-    public Expression inferType(TypingContext context) {\r
+    private void inferType(TypingContext context, boolean ignoreResult) {\r
         function = function.inferType(context);\r
         function = context.instantiate(function);\r
         MultiFunction mfun;\r
@@ -265,7 +267,12 @@ public class EApply extends Expression {
             setType(Types.metaVar(Kinds.STAR));\r
             for(int i=0;i<parameters.length;++i)\r
                 parameters[i] = parameters[i].inferType(context);\r
-            return this;\r
+            return;\r
+        }\r
+        if((ignoreResult && Skeletons.canonicalSkeleton(mfun.returnType) instanceof TFun &&\r
+                Types.canonical(mfun.effect) == Types.NO_EFFECTS) ||\r
+                (context.isInPattern() && Skeletons.canonicalSkeleton(mfun.returnType) instanceof TFun)) {\r
+            context.getErrorLog().log(location, "The function is applied with too few parameters.");\r
         }\r
         \r
         // Check parameter types\r
@@ -276,7 +283,19 @@ public class EApply extends Expression {
         \r
         context.declareEffect(location, mfun.effect);\r
         setType(mfun.returnType);\r
-\r
+    }\r
+    \r
+    @Override\r
+    public Expression inferType(TypingContext context) {\r
+        inferType(context, false);\r
+        return this;\r
+    }\r
+    \r
+    @Override\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        inferType(context, true);\r
+        if(Types.canonical(getType()) != Types.UNIT)\r
+            return new ESimpleLet(location, null, this, new ELiteral(NoRepConstant.PUNIT));\r
         return this;\r
     }\r
 \r
index 3cdbabf7816ae25b60911b5b9ef23742f0c05371..98c9aaedbfde9aa5b317ef533b4cc1b10c365538 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
@@ -20,6 +16,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EApplyType extends Expression {    \r
     Expression expression;\r
     Type parameter;\r
index 0a11d9b99b169e4787bc4526babd8384cbc01a6a..8f6892a42f4f8cfb1e5a78e91386aef908c11c5e 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
@@ -17,6 +13,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EAsPattern extends Expression {\r
 \r
     Variable var;\r
index c7b0b80ef3518554c6714f67fbcfed7b65f2221c..fc6eda2eedb898ca531f8de148f6f77c632399e2 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -20,6 +16,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException;
 import org.simantics.scl.compiler.types.exceptions.UnificationException;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EBind extends SimplifiableExpression {\r
     public Expression pattern;\r
     public Expression value;\r
index 45fb72d6340e1e95bc1cd41f5bfd179b76c14472..590cbbd96bf75ab80fd0d7d674b7c47d9164e6d6 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.names.Name;\r
@@ -35,6 +31,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException;
 import org.simantics.scl.compiler.types.util.MultiFunction;\r
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EConstant extends Expression {\r
     SCLValue value;\r
     Type[] typeParameters;\r
@@ -232,7 +232,7 @@ public class EConstant extends Expression {
             return this;\r
         }\r
         else\r
-            return this;\r
+            return applyPUnit(context);\r
     }\r
 \r
     @Override\r
index 11bc4b63357f3f459a61d6505b629d63a9a029d7..92608b7177707d8bffc0142ea7571f1b4eaac42a 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
@@ -18,6 +14,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EEnforce extends SimplifiableExpression {\r
     \r
     Query query;\r
index 108b4b707557ce188a44761f693b56c5588c0951..67fe2db7c37937b29975f75b4c29e98cd19375ea 100644 (file)
@@ -1,7 +1,6 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import static org.simantics.scl.compiler.elaboration.expressions.Expressions.*;\r
-import gnu.trove.map.hash.THashMap;\r
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.loc;\r
 \r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.java.EqRelation;\r
@@ -15,6 +14,8 @@ import org.simantics.scl.compiler.environment.Environments;
 import org.simantics.scl.compiler.errors.Locations;\r
 import org.simantics.scl.compiler.internal.parsing.Token;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class EEntityTypeAnnotation extends ASTExpression {\r
     \r
     Expression expression;\r
index 41cea63ffb212e0aaad8f3eb56feb2d674ddcfb5..cf3774f2168628edba17b2fef342b761bbbe88ee 100644 (file)
@@ -107,6 +107,11 @@ public class EEquations extends SimplifiableExpression {
         return this;\r
     }\r
     \r
+    @Override\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        return inferType(context);\r
+    }\r
+\r
     @Override\r
     public Expression simplify(SimplificationContext context) {\r
         context.getErrorLog().log(location, "Equations should be transformed into other expressions before simplification phase.");\r
index d9a24618103c301defc751a8f6150b8a3f6d326b..d3f37281dfef771c4c69ab226f9b681ad5255b24 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -18,6 +14,10 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EError extends Expression {\r
 \r
     public EError(long loc, Type type) {\r
index afbe9d64f16c5bd5f98d322406e079d6cf96a3fb..56ea79a2a458bbe0d01e1065fd428dde31480ad2 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
@@ -24,6 +20,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EExternalConstant extends Expression {\r
     Object value;\r
     \r
index bcb7bf37b867d300306aa17ed8e4727c0e94212b..b49999c06e72c35b021f99bacba81c02b54dd2b9 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.names.Name;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -15,6 +11,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EFieldAccess extends SimplifiableExpression {\r
 \r
     private static final Type VARIABLE = Types.con("Simantics/Variables", "Variable");\r
index ef5412c7bb093f8e275adb984f8ee8c7faba7e5f..55fd9b4939991348bd65e8d81abbe35f1bfca776 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -13,6 +9,10 @@ import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EGetConstraint extends SimplifiableExpression {\r
     TPred constraint;\r
     EVariable evidence;\r
index 420875999216f685b99da760e4b861ad219351d8..e1ccd53ddc3bc2a7bdf99d30fe12eb7ac19e6044 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -20,6 +16,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EIf extends Expression {\r
     public Expression condition;\r
     public Expression then_;\r
@@ -117,6 +117,14 @@ public class EIf extends Expression {
         return this;\r
     }\r
     \r
+    @Override\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        condition = condition.checkType(context, Types.BOOLEAN);\r
+        then_ = then_.checkIgnoredType(context);\r
+        else_ = else_.checkIgnoredType(context);\r
+        return this;\r
+    }\r
+    \r
     @Override\r
     public Expression decorate(ExpressionDecorator decorator) {\r
         condition = condition.decorate(decorator);\r
index 7ccd66d0a3b8240fd25d70b37bb56bca94e07cf5..101e00b840fc67c1e37c3d7f7f32d82d5092d158 100755 (executable)
@@ -1,10 +1,6 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.constants.DoubleConstant;\r
 import org.simantics.scl.compiler.constants.FloatConstant;\r
@@ -20,6 +16,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EIntegerLiteral extends SimplifiableExpression {\r
     public String value;\r
     EVariable constraint;\r
index 1d46b80c6b98d6760a048399a0f85109a81eabe4..abf4c89da4f282a79425f3a08eba5d03357e9d21 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -17,6 +13,10 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException;
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 import org.simantics.scl.compiler.types.util.MultiFunction;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ELambda extends SimplifiableExpression {\r
     public Case[] cases;\r
     Type effect = Types.NO_EFFECTS;\r
index a1505e0dd8f34d97bfc8eb4768083f6a84215464..8e9a74cd5146ea0fbb1212b660726a8fa1353366 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
@@ -21,6 +17,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ELambdaType extends Expression {\r
     public TVar[] parameters;\r
     public Expression value;\r
index a128e50634f49d88240ebe915d07463b937f5bc1..bbbc25c4de4ed7e7841172fb44f96834c5a15b85 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
@@ -25,6 +21,10 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ELet extends Expression {\r
     public Assignment[] assignments;\r
     public Expression in;\r
@@ -202,6 +202,13 @@ public class ELet extends Expression {
         in = in.checkType(context, requiredType);\r
         return this;\r
     }\r
+    \r
+    @Override\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        checkAssignments(context);\r
+        in = in.checkIgnoredType(context);\r
+        return this;\r
+    }\r
 \r
     @Override\r
     public Expression decorate(ExpressionDecorator decorator) {\r
index a7e36247ef7b70f5a4c0e769ab655cc832b57b87..abfeb2bc70c84431e30b5aa9409e87b08785f1ae 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -15,6 +11,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EListComprehension extends SimplifiableExpression {\r
 \r
     public Expression head;\r
index 4cdcc6f847f237038bccf8732d3688ffce700a53..b7165e975364cee2524239b2a01455a328d7b5d7 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -20,6 +16,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EListLiteral extends SimplifiableExpression {\r
 \r
     Expression[] components;\r
index 383e212f6b8f6fcfcfcba57897a76bccb9dbe351..15201e7f0f19e935f825ffff57f974c5c1ae957e 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.constants.Constant;\r
@@ -23,6 +19,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ELiteral extends Expression {\r
     Constant value;\r
     \r
index a218b95c38bf04913f983ba5c0978cb169b16e34..11877a60e086e9d0e6ba16f7eac4aaaccedd8cac 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
@@ -13,6 +9,7 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.environment.Environment;\r
 import org.simantics.scl.compiler.errors.Locations;\r
 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
+import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw;\r
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
 import org.simantics.scl.compiler.internal.elaboration.matching.PatternMatchingCompiler;\r
 import org.simantics.scl.compiler.internal.elaboration.matching.Row;\r
@@ -21,6 +18,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EMatch extends Expression {\r
 \r
     public Expression[] scrutinee;\r
@@ -75,7 +76,7 @@ public class EMatch extends Expression {
            CodeWriter joinPoint = w.createBlock(getType());\r
            CodeWriter failurePoint = w.createBlock(); // TODO generate only one failurePoint per function\r
            PatternMatchingCompiler.split(w, env, scrutineeVals, joinPoint.getContinuation(), failurePoint.getContinuation(), rows);\r
-           failurePoint.throw_(location, "Matching failure at: " + toString());\r
+           failurePoint.throw_(location, Throw.MatchingException, "Matching failure at: " + toString());\r
            w.continueAs(joinPoint);\r
            return w.getParameters()[0];\r
     }\r
@@ -149,6 +150,19 @@ public class EMatch extends Expression {
         setType(requiredType);\r
         return this;\r
     }\r
+    \r
+    @Override\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        Type[] scrutineeTypes = new Type[scrutinee.length];\r
+        for(int i=0;i<scrutinee.length;++i) {\r
+            scrutinee[i] = scrutinee[i].checkType(context, Types.metaVar(Kinds.STAR));\r
+            scrutineeTypes[i] = scrutinee[i].getType();\r
+        }\r
+        for(Case case_ : cases)\r
+            case_.checkIgnoredType(context, scrutineeTypes);\r
+        setType(Types.UNIT);\r
+        return this;\r
+    }\r
 \r
     @Override\r
     public Expression decorate(ExpressionDecorator decorator) {\r
index 64d5cc3c64126675f950fddb467fa7abefdeb0ec..8d8883eae66f5e0fe2f20832f922aa7ca37ffe7e 100755 (executable)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.procedure.TObjectObjectProcedure;\r
-\r
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
@@ -13,6 +10,9 @@ import org.simantics.scl.compiler.elaboration.expressions.lhstype.FunctionDefini
 import org.simantics.scl.compiler.elaboration.expressions.lhstype.LhsType;\r
 import org.simantics.scl.compiler.errors.Locations;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.procedure.TObjectObjectProcedure;\r
+\r
 public class EPreLet extends ASTExpression {\r
 \r
     List<LetStatement> assignments;\r
index ff27eb03a4ef066b0fa3f13d81080eede5a31e73..74f24ebb82496048e0d1c5c599c20350c642f646 100644 (file)
@@ -1,13 +1,13 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.expressions.ERuleset.DatalogRule;\r
 import org.simantics.scl.compiler.elaboration.expressions.block.RuleStatement;\r
 import org.simantics.scl.compiler.elaboration.relations.LocalRelation;\r
 import org.simantics.scl.compiler.errors.Locations;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class EPreRuleset extends ASTExpression {\r
 \r
     RuleStatement[] statements;\r
index 644e31ab6968cdfd984f69ed852704b4673fc2b4..f2e17aa00cf6b78f418d993e6615149acb171ff3 100755 (executable)
@@ -1,10 +1,6 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.constants.DoubleConstant;\r
 import org.simantics.scl.compiler.constants.FloatConstant;\r
@@ -19,6 +15,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ERealLiteral extends SimplifiableExpression {\r
     public String value;\r
     EVariable constraint;\r
index cbb69a34be75153b04d99a9d78ccb234676a9194..32999dcb48877a689c980d7e7c1bc73973b46345 100644 (file)
@@ -52,8 +52,29 @@ public class ERecord extends ASTExpression {
             return new EError(constructor.location);
         }
         THashMap<String,FieldAssignment> recordMap = new THashMap<String,FieldAssignment>(fields.length);
-        for(FieldAssignment field : fields)
-            recordMap.put(field.name, field);
+        for(FieldAssignment field : fields) {
+            if(field.value == null) {
+                String bestMatch = null;
+                int bestMatchLength = 0;
+                for(int i=0;i<fieldNames.length;++i) {
+                    String fieldName = fieldNames[i];
+                    if(field.name.startsWith(fieldName) && fieldName.length() > bestMatchLength) {
+                        bestMatch = fieldName;
+                        bestMatchLength = fieldName.length();
+                    }
+                }
+                if(bestMatch == null) {
+                    context.getErrorLog().log(field.location, "Invalid shorthand field " + field.name + " is defined twice.");
+                    return new EError(location);
+                }
+                field.value = new EVar(field.location, field.name);
+                field.name = bestMatch;
+            }
+            if(recordMap.put(field.name, field) != null) {
+                context.getErrorLog().log(field.location, "Field " + field.name + " is defined more than once.");
+                return new EError(location);
+            }
+        }
         Expression[] parameters = new Expression[fieldNames.length];
         boolean error = false;
         for(int i=0;i<fieldNames.length;++i) {
@@ -91,7 +112,8 @@ public class ERecord extends ASTExpression {
         if(location == Locations.NO_LOCATION) {
             location = loc;
             for(FieldAssignment field : fields)
-                field.value.setLocationDeep(loc);
+                if(field.value != null)
+                    field.value.setLocationDeep(loc);
         }
     }
     
index e512460298d5bb40e0316d5b4020d0c21f8184a3..02b8c9ddc0c4922765cbbf5ff321726e4d05ff86 100644 (file)
@@ -131,6 +131,13 @@ public class ERuleset extends SimplifiableExpression {
         return compile(context);\r
     }\r
     \r
+    @Override\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        checkRuleTypes(context);\r
+        in = in.checkIgnoredType(context);\r
+        return compile(context);\r
+    }\r
+    \r
     @Override\r
     public void collectFreeVariables(THashSet<Variable> vars) {\r
         for(DatalogRule rule : rules) {\r
index 9a0bb040d6acb15ff0aa9edba0f894aa1c28434b..1e92952330fba5b4626eac399021349c31b84688 100644 (file)
@@ -8,9 +8,6 @@ import static org.simantics.scl.compiler.elaboration.expressions.Expressions.new
 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.seq;\r
 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.tuple;\r
 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.var;\r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.common.names.Name;\r
@@ -30,6 +27,10 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ESelect extends SimplifiableExpression {\r
 \r
     private final Type ARRAY_LIST = Types.con("ArrayList", "T"); \r
index 071588ab9d5a33745ebb6c38b22d8f6cbde9fa78..e1efb30457b25973dd60ee3110930dede5b6bc38 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
@@ -27,6 +23,10 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException;
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 import org.simantics.scl.compiler.types.util.MultiFunction;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ESimpleLambda extends Expression {\r
     public Variable parameter;\r
     public Expression value;\r
index 53984840d65ca851ecceec5a82c63a5e7f633772..8e73b2392fd3add380c8e656df2eae19777c2211 100755 (executable)
@@ -141,7 +141,7 @@ public class ESimpleLet extends Expression {
 \r
     private void checkBinding(TypingContext context) {\r
         if(variable == null)\r
-            value = value.inferType(context);\r
+            value = value.checkIgnoredType(context);\r
         else if(variable.getType() == null) {\r
             value = value.inferType(context);\r
             variable.setType(value.getType());\r
@@ -168,6 +168,13 @@ public class ESimpleLet extends Expression {
         in = in.checkType(context, requiredType);\r
         return this;\r
     }\r
+    \r
+    @Override\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        checkBinding(context);\r
+        in = in.checkIgnoredType(context);\r
+        return this;\r
+    }\r
 \r
     @Override\r
     public Expression decorate(ExpressionDecorator decorator) {\r
index 63fee96ca7e8096e4454749a074052dac67c9188..24584fe65cee8a0a457925bcba857ce2aa4c2927 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 import java.util.Collections;\r
 import java.util.Comparator;\r
@@ -20,6 +16,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ETransformation extends SimplifiableExpression {\r
     public static final Object TRANSFORMATION_RULES_TYPECHECKED = new Object();\r
     \r
index 48969e77b77b770ea4c2366db7ffbb2b7b3204c0..cfeab99f4e0b783c171ecf8ac61a874d09f99a43 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -13,6 +9,10 @@ import org.simantics.scl.compiler.internal.parsing.types.TypeAst;
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ETypeAnnotation extends SimplifiableExpression {\r
     Expression value;\r
     Type type;\r
index 553677626cdfc8ba7c283a500d87ce451b8d362a..ca87d72c4e8d878ac3cb30c445758578b43a9295 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
@@ -25,6 +21,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException;
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EVariable extends Expression {\r
     public static final EVariable[] EMPTY_ARRAY = new EVariable[0];\r
     \r
@@ -144,9 +144,12 @@ public class EVariable extends Expression {
     \r
     @Override\r
     public Expression inferType(TypingContext context) {\r
-        if(context.isInPattern())\r
+        if(context.isInPattern()) {\r
             variable.setType(Types.metaVar(Kinds.STAR));\r
-        return this;\r
+            return this;\r
+        }\r
+        else\r
+            return applyPUnit(context);\r
     }\r
     \r
     @Override\r
index e7907f3578e62599536bfd89687bebc78e55ab4c..8021c407bee5687f055212c54db0ae157ef2c18a 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
@@ -22,6 +18,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException;
 import org.simantics.scl.compiler.types.exceptions.UnificationException;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class EWhen extends SimplifiableExpression {\r
 \r
     public Query query;\r
@@ -79,7 +79,7 @@ public class EWhen extends SimplifiableExpression {
         for(Variable variable : variables)\r
             variable.setType(Types.metaVar(Kinds.STAR));\r
         query.checkType(context);\r
-        action.checkType(context, Types.UNIT);\r
+        action.checkIgnoredType(context);\r
         \r
         // Compile query\r
         return compile(context);\r
index 83d7ec4e7bb5290a407df6dc3d79dff8b7fed328..edf93841b5c9ba1adf7420238ee7c24451ed81c6 100755 (executable)
@@ -1,13 +1,11 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.common.precedence.Precedence;\r
+import org.simantics.scl.compiler.constants.NoRepConstant;\r
+import org.simantics.scl.compiler.elaboration.contexts.EnvironmentalContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -36,6 +34,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException;
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 import org.simantics.scl.compiler.types.util.Typed;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public abstract class Expression extends Symbol implements Typed {\r
     public static final Expression[] EMPTY_ARRAY = new Expression[0];\r
     \r
@@ -77,10 +79,30 @@ public abstract class Expression extends Symbol implements Typed {
     public Expression inferType(TypingContext context) {\r
         return checkBasicType(context, Types.metaVar(Kinds.STAR));\r
     }\r
-       \r
-       public Expression checkBasicType(TypingContext context, Type requiredType) {\r
-           return context.subsume(inferType(context), requiredType);\r
-       }\r
+\r
+    public Expression checkBasicType(TypingContext context, Type requiredType) {\r
+        return context.subsume(inferType(context), requiredType);\r
+    }\r
+    \r
+    protected Expression applyPUnit(EnvironmentalContext context) {\r
+        Type type = Types.canonical(getType());\r
+        if(type instanceof TFun) {\r
+            TFun fun = (TFun)type;\r
+            if(fun.getCanonicalDomain() == Types.PUNIT) {\r
+                EApply result = new EApply(location, this, new ELiteral(NoRepConstant.PUNIT));\r
+                result.effect = fun.getCanonicalEffect();\r
+                return result;\r
+            }\r
+        }\r
+        return this;\r
+    }\r
+\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        Expression expression = inferType(context);\r
+        if(Types.canonical(expression.getType()) != Types.UNIT)\r
+            expression = new ESimpleLet(location, null, expression, new ELiteral(NoRepConstant.PUNIT));\r
+        return expression;\r
+    }\r
        \r
        /**\r
         * Checks the type of the expression against the given type. Adds type\r
@@ -89,7 +111,7 @@ public abstract class Expression extends Symbol implements Typed {
        public final Expression checkType(TypingContext context, Type requiredType) {\r
            //System.out.println("checkType: " + this + " :: " + requiredType);\r
            if(!context.isInPattern()) {\r
-               requiredType = Types.weakCanonical(requiredType);\r
+               requiredType = Types.canonical(requiredType);\r
            if(requiredType instanceof TForAll) {\r
                 TForAll forAll = (TForAll)requiredType;\r
                 TVar var = forAll.var;\r
index 1bd50bb6a32124834519204e10055ac360309cce..baeedd0f00a51df1e8308dfb737dd77886cb81af 100644 (file)
@@ -2,6 +2,7 @@ package org.simantics.scl.compiler.elaboration.expressions;
 
 public interface ExpressionTransformer {
     
+    Expression transform(EAmbiguous expression);
     Expression transform(EApply expression);
     Expression transform(EApplyType expression);
     Expression transform(EAsPattern expression);
index 9bec115127b2a0d5a8a32c5edc0f552743eb463a..48f72eeac0b1a3f743fb0a042eb5c78b32e54619 100755 (executable)
@@ -1,10 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
-import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -13,12 +8,17 @@ import org.simantics.scl.compiler.environment.Environment;
 import org.simantics.scl.compiler.errors.Locations;\r
 import org.simantics.scl.compiler.internal.codegen.continuations.ICont;\r
 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
+import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw;\r
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class GuardedExpressionGroup extends Expression {\r
     public GuardedExpression[] expressions;\r
 \r
@@ -58,7 +58,7 @@ public class GuardedExpressionGroup extends Expression {
         CodeWriter failure = w.createBlock();\r
         compile(env, w, success.getContinuation(), failure.getContinuation());\r
         w.continueAs(success);\r
-        failure.throw_(location, "Matching failure at: " + toString());\r
+        failure.throw_(location, Throw.MatchingException, "Matching failure at: " + toString());\r
         return result;\r
         //throw new InternalCompilerError("GuardedExpressionGroup should be handled in match compilation.");\r
     }\r
index 17f13889d9471098c9a14e48a60cc14adc654055..1a2f451eeab205b8aff61a0ae5d655a2750660f4 100644 (file)
@@ -38,6 +38,11 @@ public class StandardExpressionTransformer implements
 ExpressionTransformer, QueryTransformer, ListQualifierTransformer, StatementVisitor,
 EquationVisitor {
 
+    @Override
+    public Expression transform(EAmbiguous expression) {
+        return expression;
+    }
+
     @Override
     public Expression transform(EApply expression) {
         expression.function = expression.function.accept(this);
index 0d8da56d45fd194aad28ff83c2104b833ead823e..db1da2bd8fee8e976dfdb557980d8c82c1eca11d 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions.accessor;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -14,6 +10,10 @@ import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
 import org.simantics.scl.compiler.types.Types;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ExpressionAccessor extends FieldAccessor {\r
     public Expression fieldName;\r
 \r
index 349623178ecbbe96648d769b4d67db949ab36087..a6eeb3f55d0db6573011a10d8000185af8427710 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions.accessor;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -13,6 +9,10 @@ import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
 import org.simantics.scl.compiler.internal.parsing.Symbol;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public abstract class FieldAccessor extends Symbol {\r
     public char accessSeparator;\r
 \r
index 23733e9c179f412c6f57960beaf2c42526cdc2db..59aa3ebe2b2e777e2ba614477712de1b695d4e75 100755 (executable)
@@ -19,11 +19,12 @@ public class GuardStatement extends Statement {
 \r
     @Override\r
     public Expression toExpression(EnvironmentalContext context, boolean monadic, Expression in) {\r
-        Variable var = new Variable("_");\r
-        if(monadic)\r
+        if(monadic) {\r
+            Variable var = new Variable("_");\r
             return new EBind(location, new EVariable(location, var), value, in);\r
+        }\r
         else\r
-            return new ESimpleLet(location, var, value, in);\r
+            return new ESimpleLet(location, null, value, in);\r
     }\r
     \r
     @Override\r
index 5c82a5aea887e9acbd5ca169ddc5870d72bacb36..5f042ff93d77c61a5873b5139826045afa50ba0f 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions.list;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -16,6 +12,10 @@ import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
 import org.simantics.scl.compiler.types.Type;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ListAssignment extends ListQualifier {\r
     public Expression pattern;\r
     public Expression value;\r
index 7b4cae6bdf25ea2af7fceb6f6b3686fb3282de33..622b53842e212699a3e16704821b6c9c4d04067b 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions.list;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -19,6 +15,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ListGenerator extends ListQualifier {\r
     public Expression pattern;\r
     public Expression value;\r
index d591652a26e3f78de26e8330ecda2d66267a66fc..0a47f04b1713ddf62b6e97160b4d9e4bcd3210b8 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions.list;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -15,6 +11,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.Types;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ListGuard extends ListQualifier {\r
     public Expression condition;\r
 \r
index e05501e1e311907508e4437b35a78f1dd935f1a2..270c3ffc767491ab4848f1da681b60c30a84adbc 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions.list;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -13,6 +9,10 @@ import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator
 import org.simantics.scl.compiler.internal.parsing.Symbol;\r
 import org.simantics.scl.compiler.types.Type;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public abstract class ListQualifier extends Symbol {\r
 \r
     public abstract void checkType(TypingContext context);\r
index c5affbf96fbdf97fb699ca9ae42aa35479598727..84fa63e9ce848284cdd656ab182bf552e31ea2a4 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions.list;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -14,6 +10,10 @@ import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
 import org.simantics.scl.compiler.types.Type;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ListSeq extends ListQualifier {\r
     public ListQualifier a;\r
     public ListQualifier b;\r
index 5867a5cfe6fb8b3a67b3c236808893577ad2719f..c79714c4e406a8f118f2280cf5526a3507ae5712 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.expressions.list;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
@@ -18,6 +14,10 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.UnificationException;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ListThen extends ListQualifier {\r
     public ListQualifier left;\r
     public Expression transformer;\r
index c5f8f3621187b02caf6e19b4437071bddbd4105c..6cbdb6f6b19aedef68bf8f69321650fca39123dd 100644 (file)
@@ -9,6 +9,7 @@ import org.simantics.scl.compiler.elaboration.expressions.EApplyType;
 import org.simantics.scl.compiler.elaboration.expressions.EAsPattern;\r
 import org.simantics.scl.compiler.elaboration.expressions.EBind;\r
 import org.simantics.scl.compiler.elaboration.expressions.EConstant;\r
+import org.simantics.scl.compiler.elaboration.expressions.ECoveringBranchPoint;\r
 import org.simantics.scl.compiler.elaboration.expressions.EEnforce;\r
 import org.simantics.scl.compiler.elaboration.expressions.EEquations;\r
 import org.simantics.scl.compiler.elaboration.expressions.EError;\r
@@ -25,7 +26,6 @@ import org.simantics.scl.compiler.elaboration.expressions.EListLiteral;
 import org.simantics.scl.compiler.elaboration.expressions.ELiteral;\r
 import org.simantics.scl.compiler.elaboration.expressions.EMatch;\r
 import org.simantics.scl.compiler.elaboration.expressions.EPlaceholder;\r
-import org.simantics.scl.compiler.elaboration.expressions.ECoveringBranchPoint;\r
 import org.simantics.scl.compiler.elaboration.expressions.ERealLiteral;\r
 import org.simantics.scl.compiler.elaboration.expressions.ERuleset;\r
 import org.simantics.scl.compiler.elaboration.expressions.ESelect;\r
@@ -331,7 +331,7 @@ public class ExpressionToStringVisitor implements ExpressionVisitor, QueryVisito
             ESimpleLet let = (ESimpleLet)expression;\r
             Variable variable = let.getVariable();\r
             Expression value = let.getValue();\r
-            if("_".equals(variable.getName()))\r
+            if(variable == null || "_".equals(variable.getName()))\r
                 printAsDo(value);\r
             else {\r
                 newLine();\r
index b9534f76b98147a6d6d4f73a229067a3ffe0abe4..6bdaaea7bfda2b0d26a89944b09e6f6be0a1d289 100644 (file)
@@ -1,7 +1,10 @@
 package org.simantics.scl.compiler.elaboration.java;
 
 
-import static org.simantics.scl.compiler.elaboration.expressions.Expressions.*;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.apply;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.constant;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.string;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.var;
 
 import org.cojen.classfile.TypeDesc;
 import org.simantics.scl.compiler.constants.generic.CallJava;
index 6319e58b25d07dbc749059cfbd42a793b29a3627..a154dff2304f55200f9f3ea45221349279f13076 100755 (executable)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.elaboration.macros;
 
-import gnu.trove.map.hash.THashMap;
-
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
 import org.simantics.scl.compiler.elaboration.expressions.EApply;
@@ -13,6 +11,8 @@ import org.simantics.scl.compiler.elaboration.expressions.Variable;
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 
+import gnu.trove.map.hash.THashMap;
+
 /**
  * This is a macro rule that replaces an application with
  * the definition of the function.
index ef73ea6af1ec0745071c22c452bee333e1535866..49301b151d93e3fd7d54acc5adc7f1990d0a5beb 100755 (executable)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.elaboration.modules;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.cojen.classfile.TypeDesc;\r
@@ -16,6 +14,8 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class TypeClass extends TypeConstructor {\r
     public final TPred[] context;\r
     public final TCon name;\r
index c9bfa6fdefe6be4a41237baf28b580ae47a2413d..681c66972a415bcb6c955ff514cd21439c470fb3 100755 (executable)
@@ -1,12 +1,12 @@
 package org.simantics.scl.compiler.elaboration.modules;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import org.simantics.scl.compiler.constants.Constant;\r
 import org.simantics.scl.compiler.elaboration.errors.ElabNode;\r
 import org.simantics.scl.compiler.types.TPred;\r
 import org.simantics.scl.compiler.types.TVar;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class TypeClassInstance extends ElabNode {\r
     public final TypeClass typeClass;\r
     public final TPred[] context;    \r
index 0fc36b6d7a5ce7ca3a497e27625ec4b861ab998c..53eb780fdaf2174393a8235d15a755aa8363d5be 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
 import java.util.Arrays;
 
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
@@ -16,7 +12,10 @@ import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
 import org.simantics.scl.compiler.elaboration.query.pre.QPreExists;
 import org.simantics.scl.compiler.elaboration.query.pre.QPreGuard;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.types.Type;
+
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
 
 public abstract class QAbstractCombiner extends Query {
     public Query[] queries;
index 1f05e4734d3b3d15ca58cc17e6e4cb9c38c981c3..e04246e40e7d4224837205d7622c404527bae0aa 100644 (file)
@@ -1,15 +1,14 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
 import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.types.Type;
+
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
 
 public abstract class QAbstractModifier extends Query {
     public Query query;
index 95760513b5383e80136b8005ff9ed50ce4a8b82a..fd7dacb799b625984ccf280c1b4f96380701c950 100644 (file)
@@ -1,11 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TIntObjectHashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
 import java.util.ArrayList;
 import java.util.Set;
 
@@ -31,16 +25,22 @@ import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TIntObjectHashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
 public class QAtom extends Query {
     public SCLRelation relation;
     public Type[] typeParameters;
     public Expression[] parameters;
-    
+
     public QAtom(SCLRelation relation, Expression ... parameters) {
         this.relation = relation;
         this.parameters = parameters;
     }
-    
+
     public QAtom(SCLRelation relation, Type[] typeParameters, Expression ... parameters) {
         this.relation = relation;
         this.typeParameters = typeParameters;
@@ -52,7 +52,7 @@ public class QAtom extends Query {
         for(Expression parameter : parameters)
             parameter.collectFreeVariables(vars);
     }
-    
+
     @Override
     public void checkType(TypingContext context) {
         // Type parameters
@@ -60,7 +60,7 @@ public class QAtom extends Query {
         typeParameters = new Type[typeVariables.length];
         for(int i=0;i<typeVariables.length;++i)
             typeParameters[i] = Types.metaVar(typeVariables[i].getKind());
-        
+
         // Check parameter types
         Type[] parameterTypes = relation.getParameterTypes();
         if(parameterTypes.length != parameters.length)
@@ -70,7 +70,7 @@ public class QAtom extends Query {
                 parameters[i] = parameters[i]
                         .checkType(context, parameterTypes[i].replace(typeVariables, typeParameters));
     }
-    
+
     public Expression generateEnforce(EnforcingContext context) {
         Variable[] variables = new Variable[parameters.length];
         for(int i=0;i<variables.length;++i)
@@ -92,7 +92,7 @@ public class QAtom extends Query {
     private static class VariableMaskProcedure implements VariableProcedure {
         ConstraintCollectionContext context;
         long requiredVariablesMask = 0L;
-        
+
         public VariableMaskProcedure(ConstraintCollectionContext context) {
             this.context = context;
         }
@@ -104,7 +104,7 @@ public class QAtom extends Query {
                 requiredVariablesMask |= 1L << id;
         }
     }
-    
+
     @Override
     public void collectConstraints(ConstraintCollectionContext context) {
         try {
@@ -133,20 +133,20 @@ public class QAtom extends Query {
                     }
                 }
             }
-                   
+
             // Combine required and optional variables
             TIntHashSet allVariablesSet = new TIntHashSet();
             for(int v : optionalVariableByParameter)
                 if(v >= 0)
                     allVariablesSet.add(v);
-            
+
             context.addConstraint(new RelationConstraint(allVariablesSet.toArray(), varParameters, this,
                     optionalVariableByParameter, procedure.requiredVariablesMask));
         } catch(Exception e) {
             context.getQueryCompilationContext().getTypingContext().getErrorLog().log(location, e);
         }
     }
-    
+
     private static void collectRefs(SCLRelation relation, TObjectIntHashMap<Object> allRefs,
             TIntHashSet refs) {
         if(relation instanceof CompositeRelation) {
@@ -167,7 +167,7 @@ public class QAtom extends Query {
         for(Expression parameter : parameters)
             parameter.collectRefs(allRefs, refs);
     }
-    
+
     @Override
     public void collectVars(TObjectIntHashMap<Variable> allVars,
             TIntHashSet vars) {
@@ -215,7 +215,7 @@ public class QAtom extends Query {
             return new Diff[] { new Diff(diffable.id, new QConjunction(eqs)) };
         }
     }
-    
+
     private static boolean containsReferenceTo(
             CompositeRelation relation,
             THashMap<SCLRelation, Diffable> diffables) {
@@ -235,7 +235,7 @@ public class QAtom extends Query {
         else
             return this;
     }
-    
+
     @Override
     public void setLocationDeep(long loc) {
         if(location == Locations.NO_LOCATION) {
@@ -244,7 +244,7 @@ public class QAtom extends Query {
                 parameter.setLocationDeep(loc);
         }
     }
-    
+
     @Override
     public void accept(QueryVisitor visitor) {
         visitor.visit(this);
@@ -266,7 +266,7 @@ public class QAtom extends Query {
         }
         list.add(this);
     }
-    
+
     @Override
     public Query accept(QueryTransformer transformer) {
         return transformer.transform(this);
index 95bb7b454145638403eb824fe2d59505467947b1..07a1f4556a37d32a68246c8d2ad04fb2acb2871c 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TIntObjectHashMap;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Set;
@@ -22,6 +19,9 @@ import org.simantics.scl.compiler.elaboration.relations.LocalRelation;
 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
 import org.simantics.scl.compiler.types.Types;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TIntObjectHashMap;
+
 
 public class QConjunction extends QAbstractCombiner {
 
index f27926414da581dd3e5b35f326bcd00aefe4941f..fc1c769ff67b98a91e4904523e2b8ab145b66332 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TLongObjectHashMap;
-import gnu.trove.set.hash.TIntHashSet;
-
 import java.util.ArrayList;
 import java.util.Set;
 
@@ -25,6 +21,10 @@ import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.types.Types;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TLongObjectHashMap;
+import gnu.trove.set.hash.TIntHashSet;
+
 
 public class QDisjunction extends QAbstractCombiner {
 
index cdb0a5726da1e5a02a989fde2bcebb0fd3d84f02..5356eccc2708987042bb174f215a2ab374782084 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.Collection;
 import java.util.Set;
 
@@ -20,6 +17,9 @@ import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.kinds.Kinds;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 public class QExists extends QAbstractModifier {
     Variable[] variables;
     
index fa0794fb4b037b0a727eeb8bba56f80af42ede61..ca9378c89f19da98d41b699e95ef88c75f497048 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
@@ -17,6 +13,10 @@ import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.types.Type;
 
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
 public class QMapping extends Query {
     public final MappingRelation mappingRelation;
     public final Expression[] parameters;
index 20147c7dfd21288b43637019ebd196857d1beb2a..373efa413ddbb09a6e5d7ec302f8e823f866c858 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.TIntHashSet;
-
 import org.simantics.scl.compiler.common.names.Name;
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
 import org.simantics.scl.compiler.elaboration.expressions.EApply;
@@ -15,6 +12,9 @@ import org.simantics.scl.compiler.elaboration.query.compilation.UnsolvableQueryE
 import org.simantics.scl.compiler.elaboration.relations.LocalRelation;
 import org.simantics.scl.compiler.types.Type;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.TIntHashSet;
+
 
 public class QNegation extends QAbstractModifier {
 
index 5154495f5472dcdcb1b2e326673c6e9e3d9f3958..0ac54e22ec29d72b8468bde640220c4676a4ed39 100644 (file)
@@ -1,11 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TIntObjectHashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
 import java.util.ArrayList;
 import java.util.Set;
 
@@ -32,6 +26,12 @@ import org.simantics.scl.compiler.elaboration.relations.LocalRelation;
 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TIntObjectHashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
+
 public abstract class Query extends Symbol {
     public static final Query[] EMPTY_ARRAY = new Query[0];
     
index 7b2bfc60909cd984029fc53f546ab55d0f343222..e77e52c8a2b7d2292d005ec67814b1e4cfe883ea 100644 (file)
@@ -1,12 +1,12 @@
 package org.simantics.scl.compiler.elaboration.query.compilation;
 
-import gnu.trove.impl.Constants;
-import gnu.trove.map.hash.TObjectIntHashMap;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
 
+import gnu.trove.impl.Constants;
+import gnu.trove.map.hash.TObjectIntHashMap;
+
 public class ConstraintCollectionContext {
     QueryCompilationContext context;
     ArrayList<Variable> variables = new ArrayList<Variable>();
index 0506f410c9e971e83dedd8ba05a04daf0d71a23f..d53e4d1f27e383e18d397f2438114f3dedd80fee 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.elaboration.query.compilation;
 
-import gnu.trove.map.hash.TLongObjectHashMap;
-import gnu.trove.procedure.TLongObjectProcedure;
-
 import java.util.ArrayList;
 import java.util.Collections;
 
+import gnu.trove.map.hash.TLongObjectHashMap;
+import gnu.trove.procedure.TLongObjectProcedure;
+
 public class DynamicProgrammingOrdering {
     final ConstraintCollectionContext collectionContext;
     int variableCount;
index 0c7c21e3d0b8929e141bb702ce81c7ddd97efab8..c80d59f37f1f0f8191f230b343dc1644c3197fed 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query.compilation;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.procedure.TObjectObjectProcedure;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
@@ -15,6 +11,10 @@ import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.types.TVar;\r
 import org.simantics.scl.compiler.types.Type;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.procedure.TObjectObjectProcedure;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public class ExpressionConstraint extends QueryConstraint {\r
     Variable variable;\r
     Expression expression;\r
index 049625f6b44917eca6ea66f854e9b06613c14885..ee96433d3e11e35c7e98370916de82f6b3c0d7f8 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.elaboration.query.pre;
 
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
@@ -16,7 +12,10 @@ import org.simantics.scl.compiler.elaboration.query.QExists;
 import org.simantics.scl.compiler.elaboration.query.Query;
 import org.simantics.scl.compiler.elaboration.query.QueryVisitor;
 import org.simantics.scl.compiler.elaboration.query.compilation.ConstraintCollectionContext;
-import org.simantics.scl.compiler.types.Type;
+
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.set.hash.TIntHashSet;
 
 /**
  * Query classes that may exist before resolving
index 900c9627bc1fbbd2b98acedff7d44c45364de4c3..0a193d6c1e89806b0daff39a8b2ffc7c87ea2622 100644 (file)
@@ -1,6 +1,10 @@
 package org.simantics.scl.compiler.elaboration.relations;
 
-import static org.simantics.scl.compiler.elaboration.expressions.Expressions.*;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.apply;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.newVar;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.tuple;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.var;
+import static org.simantics.scl.compiler.elaboration.expressions.Expressions.vars;
 
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.common.names.Name;
index a14ddaf062b7435d96dcea3c7b974d3fa6c9e858..7b2f2a19e840e6f8dbde246e8631f99925ae3353 100644 (file)
@@ -4,7 +4,6 @@ import org.simantics.scl.compiler.elaboration.expressions.Expression;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
 import org.simantics.scl.compiler.elaboration.query.compilation.EnforcingContext;
 import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationContext;
-import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 
index fb59470b37151cf6d2ee8031b05fed638190f65d..26111e0b43bf781e3e922debfb61ca1eb61e09b8 100644 (file)
@@ -9,14 +9,11 @@ import static org.simantics.scl.compiler.elaboration.expressions.Expressions.tup
 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.var;
 
 import org.simantics.scl.compiler.common.names.Name;
-import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
 import org.simantics.scl.compiler.elaboration.expressions.EApply;
 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
 import org.simantics.scl.compiler.elaboration.expressions.Expression;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
 import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationContext;
-import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
index d70bf785e250622fbb2d7987fc65550cf97b804c..6bf0f781bd04ac8edeca2772a4a8f655df458c56 100644 (file)
@@ -1,10 +1,5 @@
 package org.simantics.scl.compiler.elaboration.rules;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectObjectProcedure;
-import gnu.trove.procedure.TObjectProcedure;
-import gnu.trove.set.hash.THashSet;
-
 import org.simantics.scl.compiler.common.names.Name;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
@@ -15,6 +10,11 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.kinds.Kinds;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectObjectProcedure;
+import gnu.trove.procedure.TObjectProcedure;
+import gnu.trove.set.hash.THashSet;
+
 public class TransformationRule extends Symbol {
     public static final TransformationRule[] EMPTY_ARRAY = new TransformationRule[0];
     
index 9b9647ee19bedfd7343fe3bfb79a6ad35bc46123..98e2467fa6d637fd1ffae602569d85723c2d0142 100644 (file)
@@ -1,14 +1,13 @@
 package org.simantics.scl.compiler.environment;\r
 \r
-import gnu.trove.procedure.TObjectProcedure;\r
-\r
 import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda;\r
 import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
 import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
 import org.simantics.scl.compiler.types.Type;\r
-import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.util.ProcedureType;\r
 \r
+import gnu.trove.procedure.TObjectProcedure;\r
+\r
 public abstract class AbstractLocalEnvironment implements LocalEnvironment {\r
 \r
     @Override\r
index 2fb5e41d769c1d02da6548407cd30347da92771d..e3280daf6e731494e40f2e968093dea2e0aae9ea 100644 (file)
@@ -1,12 +1,12 @@
 package org.simantics.scl.compiler.environment;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.util.Collection;
 
 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
 import org.simantics.scl.compiler.module.Module;
 
+import gnu.trove.map.hash.THashMap;
+
 public class ConcreteEnvironment extends AbstractEnvironment {
 
     private final THashMap<String, Module> moduleMap;
index 9bffef06b5d93d3bfb4644e3dcf74640c287a49d..ed08b7b690864191f88cec3baf47cfd5d84c2ef9 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.environment;
 
-import gnu.trove.procedure.TObjectProcedure;
-
 import java.util.function.Consumer;
 
 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
@@ -16,6 +14,8 @@ import org.simantics.scl.compiler.environment.filter.NamespaceFilter;
 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
 import org.simantics.scl.compiler.types.TCon;
 
+import gnu.trove.procedure.TObjectProcedure;
+
 public enum EmptyNamespace implements Namespace {
     INSTANCE;
 
index 11bc2577dfcaf41d92186bcbfa584387f440d16a..5a55a6ca130f81132d59a9ccf5dbe51884c9e346 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.environment;
 
-import gnu.trove.procedure.TObjectProcedure;
-
 import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.List;
@@ -27,6 +25,8 @@ import org.simantics.scl.compiler.top.SCLExpressionCompilationException;
 import org.simantics.scl.compiler.types.TCon;
 import org.simantics.scl.compiler.types.Type;
 
+import gnu.trove.procedure.TObjectProcedure;
+
 public class Environments {
     /**
      * Get the SCLValue object representing an SCL value defined in a given environment.
index 4ea77a0e23e779942584cfbe3177c7a1e7f5bb2d..b40bd9cdbd16f7b2aea1d685c03220bb5a7688e6 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.environment;\r
 \r
-import gnu.trove.procedure.TObjectProcedure;\r
-\r
 import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.util.ProcedureType;\r
 \r
+import gnu.trove.procedure.TObjectProcedure;\r
+\r
 /**\r
  * Provides local variable names for expressions\r
  * that do not need to defined in any module.\r
index dc388a72c2ebfe2392cd58d8172113f7c9137baa..921b9029d2d2e7e028e8a1a746908f5305ef6324 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.environment;
 
-import gnu.trove.procedure.TObjectProcedure;
-
 import java.util.function.Consumer;
 
 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
@@ -16,6 +14,8 @@ import org.simantics.scl.compiler.environment.filter.NamespaceFilter;
 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
 import org.simantics.scl.compiler.types.TCon;
 
+import gnu.trove.procedure.TObjectProcedure;
+
 public interface Namespace {
        /**
         * Find a sub-namespace with a given name
index 9fd58989d1f3b0e4953a8952990caa542b428311..bb98f1aa529b019274cf1252069126595a8db0df 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.environment;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectProcedure;
-
 import java.util.ArrayList;
 import java.util.function.Consumer;
 
@@ -20,6 +17,9 @@ import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
 import org.simantics.scl.compiler.module.Module;
 import org.simantics.scl.compiler.types.TCon;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectProcedure;
+
 public class NamespaceImpl implements Namespace {
 
     private final THashMap<String, Namespace> namespaceMap;
index 3739edb528a76e475da7707751b8aee6f2544e80..8d97123f2e960e18392a2ee18e7bec8458cd0f9b 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.environment;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import java.util.Map;\r
 \r
 import org.simantics.scl.compiler.environment.NamespaceImpl.ModuleImport;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class NamespaceSpec {\r
     public final THashMap<String, NamespaceSpec> namespaceMap = new THashMap<String, NamespaceSpec>();\r
     public final THashMap<String, ModuleImport> moduleMap = new THashMap<String, ModuleImport>();\r
index 57159b861d7d42254266dda514db36410137157f..2749ae3050b271c92a6398ede78058d8e3b8002d 100644 (file)
@@ -1,10 +1,10 @@
 package org.simantics.scl.compiler.environment.filter;\r
 \r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import org.simantics.scl.compiler.elaboration.expressions.EVar;\r
 import org.simantics.scl.compiler.module.ImportDeclaration.ImportSpec;\r
 \r
+import gnu.trove.set.hash.THashSet;\r
+\r
 public class NamespaceFilters {\r
     public static NamespaceFilter createFromSpec(ImportSpec spec) {\r
         if(spec.hiding) {\r
index bd29b328b6328df57e063268485852dd6dc3e377..d754170124477850d66050d20e98c70685672d4d 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.errors;
 
-import gnu.trove.list.array.TIntArrayList;
-
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringReader;
 
+import gnu.trove.list.array.TIntArrayList;
+
 public class CompilationErrorFormatter {
 
     public static int[] rows(Reader reader) throws IOException {
index 9d6a5645ac1b52cd8bff29da183ea7b9bdb30d35..853f316eef342c12223faf57626c00d610b2d3b4 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.analysis;\r
 \r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import org.simantics.scl.compiler.common.names.Name;\r
 import org.simantics.scl.compiler.constants.SCLConstant;\r
 import org.simantics.scl.compiler.internal.codegen.references.Val;\r
@@ -11,6 +9,8 @@ import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
 import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder;\r
 import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;\r
 \r
+import gnu.trove.set.hash.THashSet;\r
+\r
 public class LoopAnalysis {\r
 \r
     /**\r
index 5760890127cb89ef5a0d255f12fea785995db3f3..e580c7c790ffb41e6a77bf6d6921c86228298668 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.analysis;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.common.names.Name;\r
 import org.simantics.scl.compiler.constants.SCLConstant;\r
@@ -16,6 +13,9 @@ import org.simantics.scl.compiler.internal.codegen.ssa.SSAStatement;
 import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder;\r
 import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+\r
 public abstract class StatementBrowser {\r
 \r
     THashSet<SSABlock> visited;\r
index 0867b4b3f24d5a1207e578006f5c5dc7e7c29dbc..75429d9aee4a8b7691790231397d1156ecdf7d34 100644 (file)
@@ -1,9 +1,9 @@
 package org.simantics.scl.compiler.internal.codegen.optimization;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import org.simantics.scl.compiler.common.names.Name;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class OptimizationMap {\r
 \r
     public static final THashMap<Name, Optimization> OPTIMIZATIONS = new THashMap<Name, Optimization>();\r
index 803397ce6ea458018401925520e9404e2c825964..1c88ba0aa01637a42e9786597352be608c72e2ca 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.references;
 
-import gnu.trove.map.hash.THashMap;
-
 import org.cojen.classfile.TypeDesc;
 import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
 import org.simantics.scl.compiler.internal.codegen.ssa.binders.BoundVarBinder;
@@ -11,6 +9,8 @@ import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 
+import gnu.trove.map.hash.THashMap;
+
 public final class BoundVar extends Val {
     public BoundVarBinder parent;
     Type type;
index 392dfb2feb14234b4fc541fd6fd3e729638eeceb..9837fdb77a30ddd2f8cfee1372b3aa90f336453b 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.references;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.internal.codegen.types.BTypes;\r
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;\r
@@ -11,6 +9,8 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 \r
 public abstract class Val implements IVal {\r
     \r
index 3af6a00731cf9ba8d9be957846df60a5c0df919b..730463ab25d1ca6016be54533714fe6112bfe65c 100644 (file)
@@ -10,21 +10,27 @@ import org.simantics.scl.compiler.internal.codegen.references.ValRef;
 import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock;
 import org.simantics.scl.compiler.internal.codegen.ssa.SSAExit;
 import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
+import org.simantics.scl.compiler.internal.codegen.utils.Constants;
 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
 import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext;
 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.runtime.exceptions.MatchingException;
 
 public class Throw extends SSAExit {
 
-    private static final TypeDesc RuntimeException = 
+    public static final TypeDesc RuntimeException = 
             TypeDesc.forClass(RuntimeException.class);
+    public static final TypeDesc MatchingException = 
+            TypeDesc.forClass(MatchingException.class);
     
+    TypeDesc exceptionClass;
     String description;
     
-    public Throw(String description) {
+    public Throw(TypeDesc exceptionClass, String description) {
+        this.exceptionClass = exceptionClass;
         this.description = description;
     }
 
@@ -38,10 +44,14 @@ public class Throw extends SSAExit {
     public void generateCode(MethodBuilder mb) {
         //mb.push(exception.getBinding());
         //cb.mapLineNumber(location);
-        mb.newObject(RuntimeException);
+        mb.newObject(exceptionClass);
         mb.dup();
-        mb.loadConstant(description);
-        mb.invokeConstructor(RuntimeException, new TypeDesc[] {TypeDesc.STRING});
+        if(description == null)
+            mb.invokeConstructor(exceptionClass, Constants.EMPTY_TYPEDESC_ARRAY);
+        else {
+            mb.loadConstant(description);
+            mb.invokeConstructor(exceptionClass, new TypeDesc[] {TypeDesc.STRING});
+        }
         mb.throwObject();
     }
 
@@ -56,7 +66,7 @@ public class Throw extends SSAExit {
 
     @Override
     public SSAExit copy(CopyContext context) {
-        return new Throw(description);
+        return new Throw(exceptionClass, description);
     }
     
     @Override
index 8d5d24e3c421ea37a77406153286fafc1f8cdbfb..83b1e0cb67a81afe13249ace83f230097b2ed892 100644 (file)
@@ -28,7 +28,6 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 import org.simantics.scl.compiler.types.util.MultiFunction;\r
-import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
 public class LetApply extends LetStatement implements ValRefBinder {\r
     private ValRef function;\r
index 7b1db339faed0fe8b39d43726130c0c2dc31d298..25d9c2544bffd4ab6bb8470ead45408e0900d683 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.ssa.statements;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
@@ -21,6 +18,9 @@ import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
 import org.simantics.scl.compiler.types.TVar;\r
 import org.simantics.scl.compiler.types.Type;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+\r
 public class LetFunctions extends SSAStatement implements FunctionBinder {\r
     long recursiveGroupLocation;\r
     SSAFunction firstFunction;\r
index c3db313ba282a11fc0b70af210b7f9c69220ce9a..42df431810b630cdaf35d7b1d2cebfb75b280aa9 100644 (file)
@@ -49,7 +49,7 @@ public class ClassBuilder {
         return new MethodBuilder(this, moduleBuilder, (access&Opcodes.ACC_STATIC) != 0, methodVisitor, params);
     }
     
-    private MethodVisitor augmentMethodVisitor(String methodName, MethodVisitor methodVisitor) {
+    private MethodVisitor augmentMethodVisitor(final String methodName, MethodVisitor methodVisitor) {
         if(SCLCompilerConfiguration.TRACE_MAX_METHOD_SIZE && moduleBuilder != null) {
             methodVisitor = new CodeSizeEvaluator(methodVisitor) {
                 @Override
index 2383c2051c2ab420187598c7c5d46f58ceecc014..e5fb40a8a709807d43d702e94b04cb70bbad92ad 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.utils;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;\r
 import org.simantics.scl.compiler.internal.codegen.continuations.ContRef;\r
@@ -13,6 +11,8 @@ import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.Types;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class CopyContext {\r
 \r
     THashMap<Val, Val> valMap = new THashMap<Val, Val>();\r
index 4a8969f14a835345bff004bf7eb899cd4549939d..88556fdb77ba639d2b737e71c0cc7ff395f813df 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.utils;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import java.util.ArrayDeque;\r
 import java.util.ArrayList;\r
 \r
@@ -18,6 +15,9 @@ import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+\r
 public class PrintingContext {\r
 \r
     THashMap<Object, String> names = new THashMap<Object, String>(); \r
index bf2143c9c903cf24ca463dd3dfb8b42c47e3d092..8dd7a2875b488aa8c9453a673bb1f3a345b7027e 100644 (file)
@@ -1,6 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.utils;
 
-import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable;
 import org.cojen.classfile.TypeDesc;
 import org.simantics.scl.runtime.SCLContext;
 
index d58d2dd7aab1f2b46701c5cdd9cc30952c67230a..923acdba26115c6cd18d2a95d3bc15267a9a5536 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.utils;
 
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.procedure.TObjectIntProcedure;
-import gnu.trove.set.hash.THashSet;
-
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.constants.Constant;
 import org.simantics.scl.compiler.constants.SCLConstant;
@@ -17,6 +13,10 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.procedure.TObjectIntProcedure;
+import gnu.trove.set.hash.THashSet;
+
 public class SSAValidationContext {
 
     public THashSet<BoundVar> validBoundVariables = new THashSet<BoundVar>();
index f11babe06bd3ef8e110fc00d4a719cf72b424293..6bed9f0661fc854b86afa24738bc3eb6dc032f91 100644 (file)
-package org.simantics.scl.compiler.internal.codegen.writer;\r
-\r
-import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
-import org.simantics.scl.compiler.internal.codegen.continuations.Branch;\r
-import org.simantics.scl.compiler.internal.codegen.continuations.BranchRef;\r
-import org.simantics.scl.compiler.internal.codegen.continuations.ICont;\r
-import org.simantics.scl.compiler.internal.codegen.references.BoundVar;\r
-import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
-import org.simantics.scl.compiler.internal.codegen.references.ValRef;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.exits.If;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.exits.Jump;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.exits.Switch;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetFunctions;\r
-import org.simantics.scl.compiler.top.SCLCompilerConfiguration;\r
-import org.simantics.scl.compiler.types.TVar;\r
-import org.simantics.scl.compiler.types.Type;\r
-import org.simantics.scl.compiler.types.Types;\r
-import org.simantics.scl.compiler.types.exceptions.MatchException;\r
-import org.simantics.scl.compiler.types.util.MultiFunction;\r
-\r
-public class CodeWriter {\r
-\r
-    ModuleWriter moduleWriter;\r
-    SSABlock block;\r
-    \r
-    CodeWriter(ModuleWriter moduleWriter, SSABlock block) {\r
-        this.moduleWriter = moduleWriter;\r
-        this.block = block;\r
-    }\r
-\r
-    public IVal apply(int lineNumber, IVal function, IVal ... parameters) {\r
-        try {\r
-            MultiFunction mfun = Types.matchFunction(function.getType(), parameters.length);\r
-            return applyWithEffect(lineNumber,\r
-                    mfun.effect,\r
-                    mfun.returnType,\r
-                    function, parameters);\r
-        } catch (MatchException e) {\r
-            throw new InternalCompilerError(e);\r
-        }\r
-    }\r
-    \r
-    public IVal applyWithEffectChecked(int lineNumber, Type effect, Type returnType, IVal function, IVal ... parameters) {\r
-        try {\r
-            MultiFunction mfun = Types.matchFunction(function.getType(), parameters.length);\r
-            if(!Types.equals(effect, mfun.effect))\r
-                throw new InternalCompilerError();\r
-            if(!Types.equals(returnType, mfun.returnType))\r
-                throw new InternalCompilerError();\r
-        } catch (MatchException e) {\r
-            throw new InternalCompilerError(e);\r
-        }            \r
-        return applyWithEffect(lineNumber, effect, returnType, function, parameters);\r
-    }\r
-    \r
-    public IVal applyWithEffect(long location, Type effect, Type returnType, IVal function, IVal ... parameters) {\r
-        BoundVar var = new BoundVar(returnType);\r
-        LetApply apply = new LetApply(var,\r
-                effect,\r
-                function.createOccurrence(), \r
-                ValRef.createOccurrences(parameters));\r
-        apply.location = location;\r
-        block.addStatement(apply);\r
-        return var;\r
-    }\r
-    \r
-    public CodeWriter createBlock(Type ... parameterTypes) {\r
-        SSABlock newBlock = new SSABlock(parameterTypes);\r
-        block.getParent().addBlock(newBlock);\r
-        return new CodeWriter(moduleWriter, newBlock);\r
-    }\r
-    \r
-    public CodeWriter createFunction(TVar[] typeParameters, Type effect, Type returnType, Type[] parameterTypes) {\r
-        if(SCLCompilerConfiguration.DEBUG)\r
-            if(effect == null)\r
-                throw new InternalCompilerError();\r
-        SSAFunction function = new SSAFunction(typeParameters, effect, returnType);\r
-        SSABlock block = new SSABlock(parameterTypes);\r
-        function.addBlock(block);\r
-        BoundVar target = new BoundVar(function.getType());\r
-        function.setTarget(target);\r
-        \r
-        this.block.addStatement(new LetFunctions(function));\r
-        return new CodeWriter(moduleWriter, block);\r
-    }\r
-    \r
-    public RecursiveDefinitionWriter createRecursiveDefinition() {\r
-        LetFunctions let = new LetFunctions();\r
-        block.addStatement(let);\r
-        return new RecursiveDefinitionWriter(moduleWriter, let);\r
-    }\r
-    \r
-    public void continueAs(CodeWriter codeWriter) {\r
-        this.block = codeWriter.block;\r
-        codeWriter.block = null;\r
-    }\r
-    \r
-    public IVal[] getParameters() {\r
-        return block.getParameters();\r
-    }\r
-    \r
-    public ICont getContinuation() {\r
-        return block;\r
-    }\r
-    \r
-    public void jump(ICont cont, IVal ... parameters) {\r
-        block.setExit(new Jump(cont.createOccurrence(), \r
-                ValRef.createOccurrences(parameters)));\r
-        block = null;\r
-    }\r
-    \r
-    public void if_(IVal condition, ICont thenTarget, ICont elseTarget) {\r
-        block.setExit(new If(condition.createOccurrence(), \r
-                thenTarget.createOccurrence(), \r
-                elseTarget.createOccurrence()));\r
-        block = null;\r
-    }\r
-\r
-    public void return_(IVal val) {\r
-        jump(block.getParent().getReturnCont(), val);\r
-    }\r
-\r
-    public void switch_(IVal val, Branch[] branches) {\r
-        block.setExit(new Switch(val.createOccurrence(), BranchRef.toBranchRefs(branches)));\r
-        block = null;\r
-    }\r
-\r
-    public void throw_(long location, String description) {\r
-        Throw exit = new Throw(description);\r
-        exit.location = location;\r
-        block.setExit(exit);\r
-        block = null;\r
-    }\r
-    \r
-    public ModuleWriter getModuleWriter() {\r
-               return moduleWriter;\r
-       }\r
-\r
-    public SSAFunction getFunction() {\r
-        return block.getParent();\r
-    }        \r
-}\r
+package org.simantics.scl.compiler.internal.codegen.writer;
+
+import org.cojen.classfile.TypeDesc;
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
+import org.simantics.scl.compiler.internal.codegen.continuations.Branch;
+import org.simantics.scl.compiler.internal.codegen.continuations.BranchRef;
+import org.simantics.scl.compiler.internal.codegen.continuations.ICont;
+import org.simantics.scl.compiler.internal.codegen.references.BoundVar;
+import org.simantics.scl.compiler.internal.codegen.references.IVal;
+import org.simantics.scl.compiler.internal.codegen.references.ValRef;
+import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock;
+import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
+import org.simantics.scl.compiler.internal.codegen.ssa.exits.If;
+import org.simantics.scl.compiler.internal.codegen.ssa.exits.Jump;
+import org.simantics.scl.compiler.internal.codegen.ssa.exits.Switch;
+import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw;
+import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;
+import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetFunctions;
+import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
+import org.simantics.scl.compiler.types.TVar;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.exceptions.MatchException;
+import org.simantics.scl.compiler.types.util.MultiFunction;
+
+public class CodeWriter {
+
+    ModuleWriter moduleWriter;
+    SSABlock block;
+    
+    CodeWriter(ModuleWriter moduleWriter, SSABlock block) {
+        this.moduleWriter = moduleWriter;
+        this.block = block;
+    }
+
+    public IVal apply(int lineNumber, IVal function, IVal ... parameters) {
+        try {
+            MultiFunction mfun = Types.matchFunction(function.getType(), parameters.length);
+            return applyWithEffect(lineNumber,
+                    mfun.effect,
+                    mfun.returnType,
+                    function, parameters);
+        } catch (MatchException e) {
+            throw new InternalCompilerError(e);
+        }
+    }
+    
+    public IVal applyWithEffectChecked(int lineNumber, Type effect, Type returnType, IVal function, IVal ... parameters) {
+        try {
+            MultiFunction mfun = Types.matchFunction(function.getType(), parameters.length);
+            if(!Types.equals(effect, mfun.effect))
+                throw new InternalCompilerError();
+            if(!Types.equals(returnType, mfun.returnType))
+                throw new InternalCompilerError();
+        } catch (MatchException e) {
+            throw new InternalCompilerError(e);
+        }            
+        return applyWithEffect(lineNumber, effect, returnType, function, parameters);
+    }
+    
+    public IVal applyWithEffect(long location, Type effect, Type returnType, IVal function, IVal ... parameters) {
+        BoundVar var = new BoundVar(returnType);
+        LetApply apply = new LetApply(var,
+                effect,
+                function.createOccurrence(), 
+                ValRef.createOccurrences(parameters));
+        apply.location = location;
+        block.addStatement(apply);
+        return var;
+    }
+    
+    public CodeWriter createBlock(Type ... parameterTypes) {
+        SSABlock newBlock = new SSABlock(parameterTypes);
+        block.getParent().addBlock(newBlock);
+        return new CodeWriter(moduleWriter, newBlock);
+    }
+    
+    public CodeWriter createFunction(TVar[] typeParameters, Type effect, Type returnType, Type[] parameterTypes) {
+        if(SCLCompilerConfiguration.DEBUG)
+            if(effect == null)
+                throw new InternalCompilerError();
+        SSAFunction function = new SSAFunction(typeParameters, effect, returnType);
+        SSABlock block = new SSABlock(parameterTypes);
+        function.addBlock(block);
+        BoundVar target = new BoundVar(function.getType());
+        function.setTarget(target);
+        
+        this.block.addStatement(new LetFunctions(function));
+        return new CodeWriter(moduleWriter, block);
+    }
+    
+    public RecursiveDefinitionWriter createRecursiveDefinition() {
+        LetFunctions let = new LetFunctions();
+        block.addStatement(let);
+        return new RecursiveDefinitionWriter(moduleWriter, let);
+    }
+    
+    public void continueAs(CodeWriter codeWriter) {
+        this.block = codeWriter.block;
+        codeWriter.block = null;
+    }
+    
+    public IVal[] getParameters() {
+        return block.getParameters();
+    }
+    
+    public ICont getContinuation() {
+        return block;
+    }
+    
+    public void jump(ICont cont, IVal ... parameters) {
+        block.setExit(new Jump(cont.createOccurrence(), 
+                ValRef.createOccurrences(parameters)));
+        block = null;
+    }
+    
+    public void if_(IVal condition, ICont thenTarget, ICont elseTarget) {
+        block.setExit(new If(condition.createOccurrence(), 
+                thenTarget.createOccurrence(), 
+                elseTarget.createOccurrence()));
+        block = null;
+    }
+
+    public void return_(IVal val) {
+        jump(block.getParent().getReturnCont(), val);
+    }
+
+    public void switch_(IVal val, Branch[] branches) {
+        block.setExit(new Switch(val.createOccurrence(), BranchRef.toBranchRefs(branches)));
+        block = null;
+    }
+
+    public void throw_(long location, TypeDesc exceptionClass, String description) {
+        Throw exit = new Throw(exceptionClass, description);
+        exit.location = location;
+        block.setExit(exit);
+        block = null;
+    }
+    
+    public ModuleWriter getModuleWriter() {
+               return moduleWriter;
+       }
+
+    public SSAFunction getFunction() {
+        return block.getParent();
+    }        
+}
index 714f66b952fdba86910f0e270a8c2d64756f41dd..a0484176556009b895484aae50c526598d3a625d 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.codegen.writer;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.util.Map;
 
 import org.simantics.scl.compiler.common.names.Name;
@@ -15,6 +13,8 @@ import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.runtime.tuple.Tuple2;
 
+import gnu.trove.map.hash.THashMap;
+
 public class ModuleWriter {
     
     SSAModule module;
index b2489466094cf7a301291d3ba3f3d7ce2437ebbd..0267692548c25aba1121f32d17cb88f5cc16d7b1 100644 (file)
@@ -1,10 +1,10 @@
 package org.simantics.scl.compiler.internal.deriving;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import org.simantics.scl.compiler.types.TCon;\r
 import org.simantics.scl.compiler.types.Types;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class InstanceDerivers {\r
     private static final THashMap<TCon, InstanceDeriver> MAP = \r
             new THashMap<TCon, InstanceDeriver>();\r
index d19dfeec10f7243e43211d32b8c43c39beaa49d7..82df9000799336691ccd77ad4287c8384cc64959 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.constraints;
 
-import gnu.trove.map.hash.THashMap;
-
 import org.cojen.classfile.TypeDesc;
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.constants.ClassConstant;
@@ -26,6 +24,8 @@ import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 
+import gnu.trove.map.hash.THashMap;
+
 public class ConstraintEnvironment {
     Environment environment;
     
index 1473ab9c465335738f584242e47b6e7f5d137a30..4b516a734d74b49a9c4c235d7eb84039ac1f8bec 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.constraints;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
@@ -13,6 +10,9 @@ import org.simantics.scl.compiler.types.TCon;
 import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.Types;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 class ConstraintSet {
     
     private static int id = 0;
index dfff76475135ab9ec1fc5b694421c25de5e32122..dd91efb70feff2aba4eea80f9264f6a5365f2429 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.constraints;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
 import java.util.Collections;\r
@@ -20,6 +17,9 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException;
 import org.simantics.scl.compiler.types.util.TConComparator;\r
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+\r
 public class ConstraintSolver {\r
 \r
     public static THashSet<TCon> DEFAULTS_IGNORE = new THashSet<TCon>(); \r
index 3b0447394503f142c8c054b339a0480163d2047d..871fc012517df58faae3027ea43ed47ecd4ccac3 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.constraints;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.procedure.TObjectObjectProcedure;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.types.TApply;\r
@@ -11,6 +8,9 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.util.MultiApply;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.procedure.TObjectObjectProcedure;\r
+\r
 public class InstanceTree<T> {\r
 \r
     Node<T> root;\r
index 652bc00b4809d8083652b3068afbf78f88bdc677..4bd7532b4ebe01543272b21b0da6ab03658d80ed 100644 (file)
@@ -1,13 +1,13 @@
 package org.simantics.scl.compiler.internal.elaboration.constraints2;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectObjectProcedure;
-
 import org.simantics.scl.compiler.environment.Environment;
 import org.simantics.scl.compiler.types.TCon;
 import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectObjectProcedure;
+
 public class ConstraintSolver {
     final Environment environment;
     private final THashMap<TCon, ConstraintStore> constraintStores = 
index b4f2dcfa330a698e9ab58a2bcd880ccc407611ef..34973ab4551970c2801c9ea2e3080893e4827987 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.constraints2;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectProcedure;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
@@ -14,6 +11,9 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectProcedure;
+
 class ConstraintStore {
 
     private final ConstraintSolver solver;
index 1ca1e7c3071707e09061cda747da59a6211ccbbe..7f200a11c40167e48875f48ddc97d614ffeb33af 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.matching;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -27,6 +25,8 @@ import org.simantics.scl.compiler.types.TCon;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
 
+import gnu.trove.map.hash.THashMap;
+
 public class PatternMatchingCompiler {
 
     private static class ExpressionMatrix {
index 930dfe14b547208cb2dba5e228379aa700491b6e..dff4622215473df74bced2f8bcebca7da746dc9a 100644 (file)
@@ -3,6 +3,7 @@ package org.simantics.scl.compiler.internal.elaboration.profiling;
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.elaboration.expressions.Case;
+import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous;
 import org.simantics.scl.compiler.elaboration.expressions.EApply;
 import org.simantics.scl.compiler.elaboration.expressions.EApplyType;
 import org.simantics.scl.compiler.elaboration.expressions.EAsPattern;
@@ -159,6 +160,12 @@ public class BranchPointInjector extends StandardExpressionTransformer {
         return expression;
     }
     
+    @Override
+    public Expression transform(EAmbiguous expression) {
+        ++codeCounter;
+        return super.transform(expression);
+    }
+    
     @Override
     public Expression transform(EApply expression) {
         ++codeCounter;
index 34b34eccef4fc24e137634b2d433ce67e887c167..70adf524b501592229f21d1f8ed201149f9f7e72 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.subsumption;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import java.util.ArrayDeque;\r
 import java.util.ArrayList;\r
 \r
@@ -16,6 +13,9 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.util.Polarity;\r
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+\r
 public class SubSolver {\r
 \r
     public static final boolean DEBUG = false;\r
index bfffd2c6e74a6a1e40a902f7645a528256a6d14b..28ea97dfb4a754b6984fe13d2d92f8f8a2b63741 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.transformations;
 
-import gnu.trove.procedure.TObjectObjectProcedure;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
@@ -11,6 +9,8 @@ import org.simantics.scl.compiler.elaboration.relations.LocalRelation;
 import org.simantics.scl.compiler.elaboration.rules.SectionName;
 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
 
+import gnu.trove.procedure.TObjectObjectProcedure;
+
 public class DecomposedRule {
     final TransformationRule rule;
     final ArrayList<Query> sourceQueries = new ArrayList<Query>();
index 0beb90f83126543a305f48085c2c1c7cf397095c..dcb212488972f04954a6e9e13b05e734894040ea 100644 (file)
@@ -1,10 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.transformations;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TIntObjectHashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -38,11 +33,15 @@ import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.elaboration.utils.ForcedClosure;
 import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
-import org.simantics.scl.compiler.top.SCLExpressionCompilationException;
 import org.simantics.scl.compiler.types.TCon;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TIntObjectHashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+
 public class TransformationBuilder {
     private static final TCon UMap = Types.con("Unification", "UMap");
     private static final Name createUMap = Name.create("Unification", "createUMap");
index 0daeb02aea051953e3ab53b4de5b6f0f486bdb7f..7b3face61c962d3b89dbe54c4c0361914762d311 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.internal.elaboration.transformations;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
@@ -25,7 +22,7 @@ import org.simantics.scl.compiler.elaboration.expressions.block.Statement;
 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
-import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.types.TCon;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
@@ -33,6 +30,9 @@ import org.simantics.scl.compiler.types.exceptions.MatchException;
 import org.simantics.scl.compiler.types.util.MultiApply;
 import org.simantics.scl.compiler.types.util.MultiFunction;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 public class UnifiableFactory {
     private static final TCon Unifiable = Types.con("Unification", "Unifiable");
     private static final Name uVar = Name.create("Unification", "uVar");
@@ -245,11 +245,11 @@ public class UnifiableFactory {
         @Override
         public int hashCode() {
             if(hashCode == 0) {
-                TypeHashCodeContext hcContext = new TypeHashCodeContext();
-                hcContext.append(function.hashCode());
+                int hash = HashCodeUtils.SEED;
+                hash = HashCodeUtils.update(hash, function.hashCode());
                 for(Type typeParameter : typeParameters)
-                    typeParameter.updateHashCode(hcContext);
-                hashCode = hcContext.getResult();
+                    hash = typeParameter.hashCode(hash);
+                hashCode = hash;
             }
             return hashCode;
         }
index e44a18879df0a6368c7060dfaa817efe9c5e02bf..5d7e9172c737e845c1608f65b93e9f40b2d6da84 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.internal.parsing.declarations;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.elaboration.query.Query;
 
+import gnu.trove.map.hash.THashMap;
+
 public class DRuleAst extends DeclarationAst {
     public final boolean isAbstract;
     public final String name;
index d94d6c12345510e39c4f8c438c38836415c0ebac..a0ac1cc4fab8bb6f331013eadde181d50e1aa709 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.parsing.translation;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import java.util.ArrayList;\r
 import java.util.Collection;\r
 \r
@@ -9,6 +7,8 @@ import org.simantics.scl.compiler.elaboration.errors.NotPatternException;
 import org.simantics.scl.compiler.internal.parsing.declarations.DAnnotationAst;\r
 import org.simantics.scl.compiler.internal.parsing.declarations.DRelationAst;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class RelationRepository {\r
     THashMap<String, ArrayList<DRelationAst>> relations = \r
             new THashMap<String, ArrayList<DRelationAst>>();\r
index bd563120bd49770a159cb2339e1f6ad445606d9b..bfde4677352e4cff7e74661811f8e654a91c8c02 100644 (file)
@@ -1,13 +1,13 @@
 package org.simantics.scl.compiler.internal.types;
 
-import gnu.trove.map.hash.THashMap;
-
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.ITypeEnvironment;
 
+import gnu.trove.map.hash.THashMap;
+
 public class TypeElaborationContext {
 
     THashMap<String, TVar> vars; 
index 5e7aec1a0b4b9ded0efff5298963158578a37b2f..742325caaaacd4d49b3f2abc6894ce88947e5e26 100644 (file)
@@ -1,9 +1,9 @@
 package org.simantics.scl.compiler.internal.types;
 
-import gnu.trove.map.hash.TObjectIntHashMap;
-
 import org.simantics.scl.compiler.types.TVar;
 
+import gnu.trove.map.hash.TObjectIntHashMap;
+
 public class TypeHashCodeContext {
         
     public static final int APPLY = 0x12345678;
index 149e139bdbd1dff5d1e5b1bc17a16917cf326732..4168fff931241574484b794ce94e40fe4de043b0 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.internal.types.effects;
 
-import gnu.trove.map.hash.TObjectIntHashMap;
-
 import java.util.ArrayList;
 import java.util.Collection;
 
@@ -11,6 +9,8 @@ import org.simantics.scl.compiler.types.TUnion;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 
+import gnu.trove.map.hash.TObjectIntHashMap;
+
 public class EffectIdMap {
 
     public static final int MIN = 0;
index f39901c3b9e4b0a60e61bd3cf167513bb5a17f7c..93c8c8d2f17ee8a816e7811f58b13d5eb8a0a6db 100644 (file)
@@ -1,15 +1,15 @@
 package org.simantics.scl.compiler.markdown.html;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.procedure.TObjectProcedure;\r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import java.util.ArrayList;\r
 import java.util.Collections;\r
 import java.util.List;\r
 \r
 import org.simantics.scl.compiler.source.repository.ModuleSourceRepository;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.procedure.TObjectProcedure;\r
+import gnu.trove.set.hash.THashSet;\r
+\r
 public class HierarchicalDocumentationRef implements Comparable<HierarchicalDocumentationRef> {\r
     final String name;\r
     final ArrayList<HierarchicalDocumentationRef> children = new ArrayList<HierarchicalDocumentationRef>();\r
index 6a505fabb272fe39786186ba25a655c8c9fe7708..d971f7d0faf8735fe1bb8377432e1de0fa34ff1b 100644 (file)
@@ -1,9 +1,5 @@
 package org.simantics.scl.compiler.markdown.html;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectProcedure;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 import java.util.Collections;
 
@@ -27,6 +23,10 @@ import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectProcedure;
+import gnu.trove.set.hash.THashSet;
+
 public class SCLDocumentationExtensionNodeHandler implements ExtensionNodeHandler {
 
     final ModuleRepository moduleRepository;
index f2d8917b88fb7aecf7b24e7f72850945d5df1386..9be7ca24b7264d4e010e16464eea7078a8fbcc97 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.markdown.inlines;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.nio.charset.Charset;
 
+import gnu.trove.map.hash.THashMap;
+
 public class Entities {
     public static final THashMap<String, String> ENTITY_MAP = new THashMap<String, String>();
     public static int MAX_ENTITY_LENGTH;
index 163d70708ce53ee5957bb27a24ec16be6b3cab80..a6a3abdae696095ae5c78ac68260de75d9b29e7b 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.markdown.inlines;
 
-import gnu.trove.map.hash.THashMap;
-
 import org.simantics.scl.compiler.markdown.internal.Scanner;
 import org.simantics.scl.compiler.markdown.nodes.AutolinkNode;
 import org.simantics.scl.compiler.markdown.nodes.CodeNode;
@@ -14,6 +12,8 @@ import org.simantics.scl.compiler.markdown.nodes.Node;
 import org.simantics.scl.compiler.markdown.nodes.Reference;
 import org.simantics.scl.compiler.markdown.nodes.TextNode;
 
+import gnu.trove.map.hash.THashMap;
+
 public class Subject {
     THashMap<String, Reference> referenceMap;
     StringBuilder input;
index a31c70655364df5a1820bbf662ae971ce78a9146..bd2ba47b8eb9f31a7d5e03f299860c642913b072 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.markdown.internal;
 
-import gnu.trove.map.hash.TCharObjectHashMap;
-
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
 
+import gnu.trove.map.hash.TCharObjectHashMap;
+
 public class HtmlEscape {
 
     private static final Charset UTF8 = Charset.forName("UTF-8");
index 7d30856c8d65b7a3491a7e924bb65434d2e27d93..eb4626f662ef38bc7face6bf34232d23a177be08 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.markdown.internal;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringReader;
@@ -20,6 +18,8 @@ import org.simantics.scl.compiler.markdown.nodes.Node;
 import org.simantics.scl.compiler.markdown.nodes.ParagraphNode;
 import org.simantics.scl.compiler.markdown.nodes.Reference;
 
+import gnu.trove.map.hash.THashMap;
+
 public class MarkdownParser {
     public static final boolean DEBUG = false;
     public static final int CODE_INDENT = 4;
index 437d80c117c1b3390751dcd01b157b9b46d1b8b0..0254e8e597301b3c757c5087912740823f522145 100644 (file)
@@ -1,9 +1,9 @@
 package org.simantics.scl.compiler.markdown.internal;
 
-import gnu.trove.set.hash.THashSet;
-
 import org.simantics.scl.compiler.markdown.inlines.Subject;
 
+import gnu.trove.set.hash.THashSet;
+
 public class Scanner {
 
     public int level;
index 54914dd42d7545acb2b804a2c145750898da5373..a5399e88f1f642c2212ee7004b8d60f8757df441 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.module;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.util.Collection;
 import java.util.Collections;
 
@@ -20,6 +18,8 @@ import org.simantics.scl.compiler.top.ModuleInitializer;
 import org.simantics.scl.compiler.types.TCon;
 import org.simantics.scl.runtime.profiling.BranchPoint;
 
+import gnu.trove.map.hash.THashMap;
+
 public abstract class LazyModule implements Module {
 
     String moduleName;
index 3a39c4e0e2252ecc823eb238e2ba33cf601aaaaa..13157f9fbb26bc470d682a54de78ed05612f5cc3 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.module.repository;\r
 \r
-import gnu.trove.procedure.TObjectProcedure;\r
-\r
 import java.util.ArrayList;\r
 import java.util.List;\r
 import java.util.regex.Pattern;\r
@@ -11,6 +9,8 @@ import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter;
 import org.simantics.scl.compiler.errors.Failable;\r
 import org.simantics.scl.compiler.module.Module;\r
 \r
+import gnu.trove.procedure.TObjectProcedure;\r
+\r
 public class ModuleRepositories {\r
     public static List<SCLValue> allValuesMatching(final ModuleRepository repository, String pattern) {\r
         final Pattern compiledPattern = pattern == null ? null \r
index bb2e5efc0a7deb57fc5081c9918a7683f40775c6..c91daab91147480b6437b32a52be87a261b50261 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.runtime;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.util.Map;
 
 import org.simantics.scl.compiler.constants.Constant;
 
+import gnu.trove.map.hash.THashMap;
+
 public class ExpressionClassLoader extends ClassLoader implements MutableClassLoader {
     public static final boolean VALIDATE_CLASS_NAMES = true;
     public static final boolean TRACE_CLASS_CREATION = false;
index 8fd9a7a0b3f81226b30a03076c8952cf326e618a..adf36f8af062a615b069bf86993233dc2d484759 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.runtime;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.util.Map;
 
 import org.simantics.scl.compiler.constants.Constant;
 
+import gnu.trove.map.hash.THashMap;
+
 public interface MutableClassLoader {
 
     public static final String SCL_PACKAGE_PREFIX = "scl.";
index cbac0c85ac213df1a0b7cdcaf1c61836a9dfc58b..8d7080394fc59a64c06709bc0238e3cafd32129d 100644 (file)
@@ -1,9 +1,9 @@
 package org.simantics.scl.compiler.runtime;
 
-import gnu.trove.map.hash.THashMap;
-
 import org.simantics.scl.compiler.environment.Environment;
 
+import gnu.trove.map.hash.THashMap;
+
 public class RuntimeEnvironmentImpl implements RuntimeEnvironment {
 
     private final Environment environment;
index d1d897174e6ec19c77eddacd0c49dbb41c3d5115..80db43ef0b1e2debda2904a3dcc0d4ce6e3f1732 100644 (file)
@@ -1,9 +1,9 @@
 package org.simantics.scl.compiler.runtime;\r
 \r
-import gnu.trove.map.hash.THashMap;\r
-\r
 import java.util.Collection;\r
 \r
+import gnu.trove.map.hash.THashMap;\r
+\r
 public class RuntimeModuleMap {\r
     THashMap<String, RuntimeModule> moduleMap = new THashMap<String, RuntimeModule>(); \r
     \r
index efdc630000c9932a39a413509cbcccc64a1ff158..1316ee5d7075afcb65c05ec9aad3eaf5b1d0d2f1 100644 (file)
@@ -2,7 +2,6 @@ package org.simantics.scl.compiler.source;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.charset.Charset;
 
 import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidator;
 import org.simantics.scl.compiler.internal.codegen.types.RuntimeJavaReferenceValidator;
index 310472cdc9838ccbfee1539b4f3b276d32536db5..873859a2de6a65c5a2eec24e853523bafae09913 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.source.repository;
 
-import gnu.trove.procedure.TObjectProcedure;
-import gnu.trove.set.hash.THashSet;
-
 import java.io.IOException;
 import java.net.URL;
 
@@ -11,6 +8,9 @@ import org.simantics.scl.compiler.module.repository.UpdateListener;
 import org.simantics.scl.compiler.source.ClassModuleSource;
 import org.simantics.scl.compiler.source.ModuleSource;
 
+import gnu.trove.procedure.TObjectProcedure;
+import gnu.trove.set.hash.THashSet;
+
 public class ClassModuleSourceRepository extends AbstractModuleSourceRepository {
     
     private final Class<?> clazz;
index ce3f775ce969ddb756064146dae9ba1e82dc4f50..82bb0bcf94368296ccc083adb5f3e6e196777878 100644 (file)
@@ -1,10 +1,10 @@
 package org.simantics.scl.compiler.source.repository;
 
-import gnu.trove.procedure.TObjectProcedure;
-
 import org.simantics.scl.compiler.module.repository.UpdateListener;
 import org.simantics.scl.compiler.source.ModuleSource;
 
+import gnu.trove.procedure.TObjectProcedure;
+
 public class CompositeModuleSourceRepository implements ModuleSourceRepository {
     public final ModuleSourceRepository[] children;
 
index 5a4e93ce57eb707530acd90cb09bc4177b3e2107..805dd77f465b90b999ecc27aec7f3a3643842139 100644 (file)
@@ -1,8 +1,5 @@
 package org.simantics.scl.compiler.source.repository;
 
-import gnu.trove.procedure.TObjectProcedure;
-import gnu.trove.set.hash.THashSet;
-
 import java.io.File;
 import java.io.IOException;
 
@@ -12,6 +9,9 @@ import org.simantics.scl.compiler.source.ClassModuleSource;
 import org.simantics.scl.compiler.source.FileModuleSource;
 import org.simantics.scl.compiler.source.ModuleSource;
 
+import gnu.trove.procedure.TObjectProcedure;
+import gnu.trove.set.hash.THashSet;
+
 public class FileModuleSourceRepository extends AbstractModuleSourceRepository {
     
     private final File path;
index 6cbf03aef8756df416144fbf649922b40bb1f4b2..9872451c311e904cb72aec9bd34bad833184a240 100644 (file)
@@ -1,13 +1,13 @@
 package org.simantics.scl.compiler.source.repository;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectProcedure;
-
 import org.simantics.scl.compiler.module.Module;
 import org.simantics.scl.compiler.module.repository.UpdateListener;
 import org.simantics.scl.compiler.source.ModuleSource;
 import org.simantics.scl.compiler.source.PrecompiledModuleSource;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectProcedure;
+
 /**
  * An implementation of {@link ModuleSourceRepository} as a finite map.
  * This implementation does not support listening module changes,
index 71e08dcd65979a3b7b2ccfa6cf3115dd35696363..76698f5be6a44d9cea0db368d933b2e2d3251deb 100644 (file)
@@ -1,11 +1,11 @@
 package org.simantics.scl.compiler.source.repository;
 
-import gnu.trove.procedure.TObjectProcedure;
-
 import org.simantics.scl.compiler.module.repository.ModuleRepository;
 import org.simantics.scl.compiler.module.repository.UpdateListener;
 import org.simantics.scl.compiler.source.ModuleSource;
 
+import gnu.trove.procedure.TObjectProcedure;
+
 /**
  * An interface for locating modules descriptors and listening if they change.
  * An instance of this interface is used to create a {@link ModuleRepository}.
index 6cb68b67364046470a52ebcc7b3c6486bfaf9480..5c8f59bb2dcee005fc5c006f72c4f453fa987990 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.top;
 
-import gnu.trove.set.hash.THashSet;
-
 import java.io.StringReader;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -59,6 +57,8 @@ import org.simantics.scl.compiler.types.util.ProcedureType;
 import org.simantics.scl.runtime.function.FunctionImpl1;
 import org.simantics.scl.runtime.tuple.Tuple0;
 
+import gnu.trove.set.hash.THashSet;
+
 public class ExpressionEvaluator {
 
     public static final boolean TRACE_INTERPRETATION_VS_COMPILATION = false;
index e80883969a95ed2c7453b45810fe544c5262ca4b..8b788c2ffe459faea2c045099cdc4e8efdfffdb2 100644 (file)
@@ -1,13 +1,13 @@
 package org.simantics.scl.compiler.top;
 
-import gnu.trove.impl.Constants;
-import gnu.trove.map.hash.TObjectIntHashMap;
-
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
 import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;
 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
 
+import gnu.trove.impl.Constants;
+import gnu.trove.map.hash.TObjectIntHashMap;
+
 
 public class ExpressionInterpretationContext {
 
index 799a1495addbe0897c8fcc8bb4dec0a37a3133ac..d7b896a98ff90edd0f2d60e917f8779c6537cb2e 100755 (executable)
@@ -33,4 +33,6 @@ public interface SCLCompilerConfiguration {
     public static final boolean EVERY_RULE_ENFORCEMENT_IN_SEPARATE_METHOD = true;
     public static final boolean EVERY_DATALOG_STRATUM_IN_SEPARATE_METHOD = true;
     
+    public static final boolean ALLOW_OVERLOADING = false;
+    
 }
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Skeletons.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/Skeletons.java
new file mode 100644 (file)
index 0000000..81dec24
--- /dev/null
@@ -0,0 +1,292 @@
+package org.simantics.scl.compiler.types;
+
+import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
+import org.simantics.scl.compiler.types.exceptions.KindUnificationException;
+import org.simantics.scl.compiler.types.exceptions.UnificationException;
+import org.simantics.scl.compiler.types.kinds.Kinds;
+
+import gnu.trove.map.hash.THashMap;
+
+public class Skeletons {
+    
+    public static Type canonicalSkeleton(Type type) {
+        while(type instanceof TMetaVar) {
+            TMetaVar metaVar = (TMetaVar)type;
+            if(metaVar.ref != null)
+                type = metaVar.ref;
+            else if(metaVar.skeletonRef != null)
+                type = metaVar.skeletonRef;
+            else
+                return metaVar;
+        }
+        return type;
+    }
+    
+    public static Type canonicalSkeleton(THashMap<TMetaVar,Type> unifications, Type type) {
+        while(type instanceof TMetaVar) {
+            TMetaVar metaVar = (TMetaVar)type;
+            if(metaVar.ref != null)
+                type = metaVar.ref;
+            else if(metaVar.skeletonRef != null)
+                type = metaVar.skeletonRef;
+            else {
+                Type temp = unifications.get(metaVar);
+                if(temp == null)
+                    return metaVar;
+                else
+                    type = temp;
+            }
+        }
+        return type;
+    }
+    
+    public static boolean doesSkeletonContain(THashMap<TMetaVar,Type> unifications, Type type, TMetaVar metaVar) {
+        type = canonicalSkeleton(unifications, type);
+        if(type == metaVar)
+            return true;
+        if(type instanceof TFun) {
+            TFun fun = (TFun)type;
+            return doesSkeletonContain(unifications, fun.domain, metaVar)
+                    || doesSkeletonContain(unifications, fun.range, metaVar); 
+        }
+        if(type instanceof TApply) {
+            TApply apply = (TApply)type;
+            return doesSkeletonContain(unifications, apply.function, metaVar)
+                    || doesSkeletonContain(unifications, apply.parameter, metaVar); 
+        }
+        if(type instanceof TForAll) {
+            TForAll forAll = (TForAll)type;
+            return doesSkeletonContain(unifications, forAll.type, metaVar); 
+        }
+        if(type instanceof TPred) {
+            TPred pred = (TPred)type;
+            for(Type param : pred.parameters)
+                if(doesSkeletonContain(unifications, param, metaVar))
+                    return true;
+            return false;
+        }
+        else
+            return false;
+    }
+
+    /**
+     * Returns true, if unification of the skeletons of the types would succeed.
+     */
+    public static boolean areSkeletonsCompatible(THashMap<TMetaVar,Type> unifications, Type a, Type b) {
+        a = canonicalSkeleton(unifications, a);
+        b = canonicalSkeleton(unifications, b);
+        if(a == b)
+            return true;
+        Class<?> ca = a.getClass();
+        Class<?> cb = b.getClass();
+        
+        if(ca == TMetaVar.class) {
+            TMetaVar ma = (TMetaVar)a;
+            if(doesSkeletonContain(unifications, b, ma))
+                return false;
+            unifications.put(ma, b);
+            return true;
+        }
+        if(cb == TMetaVar.class) {
+            TMetaVar mb = (TMetaVar)b;
+            if(doesSkeletonContain(unifications, a, mb))
+                return false;
+            unifications.put(mb, a);
+            return true;
+        }
+        if(ca != cb)
+            return false;
+        if(ca == TFun.class) {
+            TFun funA = (TFun)a;
+            TFun funB = (TFun)b;
+            return areSkeletonsCompatible(unifications, funA.domain, funB.domain)
+                    && areSkeletonsCompatible(unifications, funA.range, funB.range);
+        }
+        if(ca == TApply.class) {
+            TApply applyA = (TApply)a;
+            TApply applyB = (TApply)b;
+            return areSkeletonsCompatible(unifications, applyA.function, applyB.function)
+                    && areSkeletonsCompatible(unifications, applyA.parameter, applyB.parameter);
+        }
+        if(ca == TPred.class) {
+            TPred predA = (TPred)a;
+            TPred predB = (TPred)b;
+            if(predA.typeClass != predB.typeClass)
+                return false;
+            for(int i=0;i<predA.parameters.length;++i)
+                if(!areSkeletonsCompatible(unifications, predA.parameters[i], predB.parameters[i]))
+                    return false;
+            return true;
+        }
+        if(ca == TForAll.class) {
+            TForAll forAllA = (TForAll)a;
+            TForAll forAllB = (TForAll)b;
+            TVar temp = Types.var(forAllA.var.getKind());
+            return areSkeletonsCompatible(unifications,
+                    forAllA.type.replace(forAllA.var, temp),
+                    forAllB.type.replace(forAllB.var, temp));
+        }
+        return false;
+    }
+
+    public static void unifySkeletons(Type a, Type b) throws UnificationException {
+        a = canonicalSkeleton(a);
+        b = canonicalSkeleton(b);
+        
+        if(a == b)
+            return;
+        if(a instanceof TMetaVar) {
+            ((TMetaVar) a).setSkeletonRef(b);
+            return;
+        }
+        if(b instanceof TMetaVar) {
+            ((TMetaVar) b).setSkeletonRef(a);
+            return;
+        }
+        
+        Class<?> ca = a.getClass();
+        Class<?> cb = b.getClass();
+        if(ca != cb) {
+            throw new UnificationException(a, b);
+        }
+        if(ca == TApply.class) 
+            //unifySkeletons((TApply)a, (TApply)b);
+            Types.unify(a, b);
+        else if(ca == TFun.class) 
+            unifySkeletons((TFun)a, (TFun)b);
+        else if(ca == TForAll.class)
+            unifySkeletons((TForAll)a, (TForAll)b);
+        else if(ca == TPred.class) 
+            //unifySkeletons((TPred)a, (TPred)b);
+            Types.unify(a, b);
+        else if(ca == TUnion.class) 
+            unifySkeletons((TUnion)a, (TUnion)b);
+        else // ca == TCon.class || ca = TVar.class 
+            throw new UnificationException(a, b);
+    }
+    
+    public static void unifySkeletons(TFun a, TFun b) throws UnificationException {
+        unifySkeletons(a.domain, b.domain);
+        unifySkeletons(a.range, b.range);
+    }
+
+    public static void unifySkeletons(TApply a, TApply b) throws UnificationException {
+        unifySkeletons(a.function, b.function);
+        unifySkeletons(a.parameter, b.parameter);
+    }
+
+    public static void unifySkeletons(TForAll a, TForAll b) throws UnificationException {
+        try {
+            Kinds.unify(a.var.getKind(), b.var.getKind());
+        } catch (KindUnificationException e) {
+            throw new UnificationException(a, b);
+        }
+        TVar newVar = Types.var(a.var.getKind());
+        unifySkeletons(a.type.replace(a.var, newVar), b.type.replace(b.var, newVar));
+    }
+
+    public static void unifySkeletons(TPred a, TPred b) throws UnificationException {
+        if(a.typeClass != b.typeClass
+                || a.parameters.length != b.parameters.length)
+            throw new UnificationException(a, b);
+        for(int i=0;i<a.parameters.length;++i)
+            unifySkeletons(a.parameters[i], b.parameters[i]);
+    }
+
+    public static void unifySkeletons(TUnion a, TUnion b) throws UnificationException {
+        // Nothing to do
+    }
+    
+    public static Type commonSkeleton(Environment context, Type[] types) {
+        THashMap<Type[], TMetaVar> metaVarMap = new THashMap<Type[], TMetaVar>() {
+            @Override
+            protected boolean equals(Object a, Object b) {
+                return Types.equals((Type[])a, (Type[])b);
+            }
+            @Override
+            protected int hash(Object a) {
+                Type[] types = (Type[])a;
+                int hash = HashCodeUtils.SEED;
+                for(Type type : types)
+                    hash = type.hashCode(hash);
+                return hash;
+            }
+        };
+        return commonSkeleton(context, metaVarMap, types);
+    }
+
+    private static TMetaVar metaVarFor(Environment context, THashMap<Type[], TMetaVar> metaVarMap, Type[] types) {
+        TMetaVar result = metaVarMap.get(types);
+        if(result == null) {
+            try {
+                result = Types.metaVar(types[0].inferKind(context));
+            } catch (KindUnificationException e) {
+                result = Types.metaVar(Kinds.STAR);
+            }
+            metaVarMap.put(types, result);
+        }
+        return result;
+    }
+    
+    /**
+     * Finds the most specific type that can be unified with the all the types
+     * given as a parameter.
+     */
+    private static Type commonSkeleton(Environment context, THashMap<Type[], TMetaVar> metaVarMap, Type[] types) {
+        for(int i=0;i<types.length;++i)
+            types[i] = canonicalSkeleton(types[i]);
+
+        Type first = types[0];
+        Class<?> clazz = first.getClass();
+        for(int i=1;i<types.length;++i)
+            if(types[i].getClass() != clazz)
+                return metaVarFor(context, metaVarMap, types);
+
+        if(clazz == TCon.class) {
+            for(int i=1;i<types.length;++i)
+                if(types[i] != first)
+                    return metaVarFor(context, metaVarMap, types);
+            return first;
+        }
+        else if(clazz == TApply.class) {
+            Type[] functions = new Type[types.length];
+            Type[] parameters = new Type[types.length];
+            for(int i=0;i<types.length;++i) {
+                TApply apply = (TApply)types[i];
+                functions[i] = apply.function;
+                parameters[i] = apply.parameter;
+            }
+            return Types.apply(
+                    commonSkeleton(context, metaVarMap, functions),
+                    commonSkeleton(context, metaVarMap, parameters));
+        }
+        else if(clazz == TFun.class) {
+            Type[] domains = new Type[types.length];
+            Type[] effects = new Type[types.length];
+            Type[] ranges = new Type[types.length];
+            for(int i=0;i<types.length;++i) {
+                TFun fun = (TFun)types[i];
+                if(fun.domain instanceof TPred)
+                    return metaVarFor(context, metaVarMap, types);
+                domains[i] = fun.domain;
+                effects[i] = fun.effect;
+                ranges[i] = fun.range;
+            }
+            return Types.functionE(
+                    commonSkeleton(context, metaVarMap, domains),
+                    commonEffect(effects),
+                    commonSkeleton(context, metaVarMap, ranges));
+        }
+        else
+            return metaVarFor(context, metaVarMap, types);
+    }
+
+    private static Type commonEffect(Type[] effects) {
+        Type first = effects[0];
+        for(int i=1;i<effects.length;++i)
+            if(!Types.equals(first, effects[i]))
+                return Types.metaVar(Kinds.EFFECT);
+        return first;
+    }
+}
index ced969286a869109ea739c2ff7fdb76edb888a14..88d80882e67312989f945ee6a81524b79418fcad 100644 (file)
@@ -1,12 +1,10 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 import java.util.List;
 
 import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TApplyAst;
 import org.simantics.scl.compiler.internal.types.ast.TListAst;
@@ -19,6 +17,9 @@ import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TMultiApply;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 
 
 /**
@@ -26,8 +27,8 @@ import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
  * @author Hannu Niemist&ouml;
  */
 public class TApply extends Type {
-    public final Type function;
-    public final Type parameter;
+    public Type function;
+    public Type parameter;
     
     public TApply(Type function, Type parameter) {
         if(NULL_CHECKS) {
@@ -156,6 +157,12 @@ public class TApply extends Type {
         Kind parameterKind = parameter.inferKind(context);
         Kinds.unify(functionKind, Kinds.arrow(parameterKind, requiredKind));
     }
+       
+       @Override
+       public Kind getKind(Environment context) {
+           Kind functionKind = function.getKind(context);
+           return Kinds.rangeOfArrow(functionKind);
+       }
 
     @Override
     public boolean containsMetaVars() {
@@ -194,4 +201,43 @@ public class TApply extends Type {
         else
             return new TApply(newFunction, newParameter);
     }
+
+    @Override
+    public int hashCode(int hash) {
+        hash = HashCodeUtils.updateWithPreprocessedValue(hash, APPLY_HASH);
+        hash = function.hashCode(hash);
+        hash = parameter.hashCode(hash);
+        return hash;
+    }
+    
+    @Override
+    public int hashCode(int hash, TVar[] boundVars) {
+        hash = HashCodeUtils.updateWithPreprocessedValue(hash, APPLY_HASH);
+        hash = function.hashCode(hash, boundVars);
+        hash = parameter.hashCode(hash, boundVars);
+        return hash;
+    }
+    
+    public Type getCanonicalFunction() {
+        if(function instanceof TMetaVar)
+            function = function.canonical();
+        return function;
+    }
+    
+    public Type getCanonicalParameter() {
+        if(parameter instanceof TMetaVar)
+            parameter = parameter.canonical();
+        return parameter;
+    }
+    
+    @Override
+    public boolean equalsCanonical(Type other) {
+        if(this == other)
+            return true;
+        if(!other.getClass().equals(TApply.class))
+            return false;
+        TApply apply = (TApply)other;
+        return getCanonicalFunction().equalsCanonical(apply.getCanonicalFunction())
+                && getCanonicalParameter().equalsCanonical(apply.getCanonicalParameter());
+    }
 }
index 7e9d25001cbfa42f4fe38672e083e1c320935d74..16e0c29eb5b962634cce80b8fe82f904f612461d 100644 (file)
@@ -1,12 +1,10 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.environment.Environment;
 import org.simantics.scl.compiler.internal.codegen.utils.NameMangling;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TConAst;
 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
@@ -15,10 +13,13 @@ import org.simantics.scl.compiler.types.kinds.Kind;
 import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 /**
  * This class represents an SCL type constant with a name given in a module.
  */
-public class TCon extends Type {
+public final class TCon extends Type {
     public final String module;
     public final String name;
 
@@ -104,6 +105,10 @@ public class TCon extends Type {
        public Kind inferKind(Environment context) throws KindUnificationException {
         return context.getTypeConstructor(this).kind;
     }
+       
+       public Kind getKind(Environment context) {
+           return context.getTypeConstructor(this).kind;
+       }
 
     @Override
     public boolean containsMetaVars() {
@@ -148,4 +153,19 @@ public class TCon extends Type {
     public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {
         return this;
     }
+
+    @Override
+    public int hashCode(int hash) {
+        return HashCodeUtils.update(hash, System.identityHashCode(this));
+    }
+    
+    @Override
+    public int hashCode(int hash, TVar[] boundVars) {
+        return HashCodeUtils.update(hash, System.identityHashCode(this));
+    }
+    
+    @Override
+    public boolean equalsCanonical(Type other) {
+        return this == other;
+    }
 }
index a22a4b244853406f0ca83dbfaff4d72e5c6ef16e..98b4578af676642e54288a161037eda249314150 100644 (file)
@@ -1,12 +1,10 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
+import java.util.Arrays;
 
 import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TForAllAst;
 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
@@ -16,10 +14,14 @@ import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+
 
 public class TForAll extends Type {
     public final TVar var;
-    public final Type type;
+    public Type type;
     
     TForAll(TVar var, Type type) {
         if(NULL_CHECKS) {
@@ -150,4 +152,76 @@ public class TForAll extends Type {
         // Should never get here
         return new TMetaVar(Kinds.STAR);
     }
+    
+    @Override
+    public int hashCode(int hash) {
+        int count=1;
+        {
+            Type t = Types.canonical(type);
+            while(t instanceof TForAll) {
+                t = Types.canonical( ((TForAll)t).type );
+                ++count;
+            }
+        }
+        TVar[] boundVars = new TVar[count];
+        boundVars[0] = var;
+        TForAll t = this;
+        {
+            for(int i=1;i<count;++i) {
+                t = (TForAll)Types.canonical(t.type);
+                boundVars[i] = t.var;
+            }
+        }
+        
+        for(int i=0;i<count;++i)
+            hash = HashCodeUtils.updateWithPreprocessedValue(hash, FORALL_HASH);
+        return t.type.hashCode(hash, boundVars);
+    }
+    
+    @Override
+    public int hashCode(int hash, TVar[] oldBoundVars) {
+        int count=1;
+        {
+            Type t = Types.canonical(type);
+            while(t instanceof TForAll) {
+                t = Types.canonical( ((TForAll)t).type );
+                ++count;
+            }
+        }
+        TVar[] boundVars = Arrays.copyOf(oldBoundVars, oldBoundVars.length + count);
+        boundVars[oldBoundVars.length] = var;
+        TForAll t = this;
+        {
+            for(int i=1;i<count;++i) {
+                t = (TForAll)Types.canonical(t.type);
+                boundVars[oldBoundVars.length + i] = t.var;
+            }
+        }
+        
+        for(int i=0;i<count;++i)
+            hash = HashCodeUtils.updateWithPreprocessedValue(hash, FORALL_HASH);
+        return t.type.hashCode(hash, boundVars);
+    }
+    
+    public Type getCanonicalType() {
+        if(type instanceof TMetaVar)
+            type = type.canonical();
+        return type;
+    }
+
+    @Override
+    public boolean equalsCanonical(Type other) {
+        if(this == other)
+            return true;
+        if(!other.getClass().equals(TForAll.class))
+            return false;
+        TForAll forAll = (TForAll)other;
+        return getCanonicalType().equalsCanonical(forAll.getCanonicalType().replace(forAll.var, var));
+    }
+
+    @Override
+    public Kind getKind(Environment context) {
+        return Kinds.STAR;
+    } 
+    
 }
index 917526dd0bd4494bfa3e4dc73f295f2a0cc3befd..e26c5b07ac923922a8c4e4270ede948b3b1f3cbb 100644 (file)
@@ -1,11 +1,9 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TEffectAst;
 import org.simantics.scl.compiler.internal.types.ast.TFunctionAst;
@@ -17,10 +15,13 @@ import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 public class TFun extends Type {
-    public final Type domain;
-    public final Type effect;
-    public final Type range;
+    public Type domain;
+    public Type effect;
+    public Type range;
     
     TFun(Type domain, Type effect, Type range) {
         if(domain == null)
@@ -189,4 +190,57 @@ public class TFun extends Type {
         Type newRange = range.copySkeleton(metaVarMap);
         return new TFun(newDomain, newEffect, newRange);
     }
+    
+    @Override
+    public int hashCode(int hash) {
+        hash = HashCodeUtils.updateWithPreprocessedValue(hash, FUN_HASH);
+        hash = domain.hashCode(hash);
+        hash = effect.hashCode(hash);
+        hash = range.hashCode(hash);
+        return hash;
+    }
+    
+    @Override
+    public int hashCode(int hash, TVar[] boundVars) {
+        hash = HashCodeUtils.updateWithPreprocessedValue(hash, FUN_HASH);
+        hash = domain.hashCode(hash, boundVars);
+        hash = effect.hashCode(hash, boundVars);
+        hash = range.hashCode(hash, boundVars);
+        return hash;
+    }
+    
+    public Type getCanonicalDomain() {
+        if(domain instanceof TMetaVar)
+            domain = domain.canonical();
+        return domain;
+    }
+    
+    public Type getCanonicalEffect() {
+        if(effect instanceof TMetaVar)
+            effect = effect.canonical();
+        return effect;
+    }
+    
+    public Type getCanonicalRange() {
+        if(range instanceof TMetaVar)
+            range = range.canonical();
+        return range;
+    }
+
+    @Override
+    public boolean equalsCanonical(Type other) {
+        if(this == other)
+            return true;
+        if(!other.getClass().equals(TFun.class))
+            return false;
+        TFun fun = (TFun)other;
+        return getCanonicalDomain().equalsCanonical(fun.getCanonicalDomain())
+                && getCanonicalEffect().equalsCanonical(fun.getCanonicalEffect())
+                && getCanonicalRange().equalsCanonical(fun.getCanonicalRange());
+    }
+
+    @Override
+    public Kind getKind(Environment context) {
+        return Kinds.STAR;
+    }
 }
index 8d2307b232423d33182cfb8a130bc912af52012a..0d3114fc5765b0bad9a3ad11df5aaef8dc803bf1 100644 (file)
@@ -1,11 +1,10 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TVarAst;
 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
@@ -17,6 +16,9 @@ import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 
 
 /**
@@ -28,10 +30,34 @@ import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
  */
 public class TMetaVar extends Type {
     public static final TMetaVar[] EMPTY_ARRAY = new TMetaVar[0];
+    public static final boolean DEBUG = false;
     
     Type ref = null;
+    Type skeletonRef = null;
     Polarity polarity = Polarity.NO_POLARITY;
     private Kind kind;
+    private TMetaVarListener listener;
+    
+    public static abstract class TMetaVarListener {
+        private Object prev; // TMetaVarListener or TMetaVar
+        private TMetaVarListener next;
+        
+        public abstract void notifyAboutChange();
+        
+        public void remove() {
+            if(prev == null)
+                return; // Not added or not anymore listening TMetaVar
+            if(prev instanceof TMetaVar)
+                ((TMetaVar)prev).listener = next;
+            else
+                ((TMetaVarListener)prev).next = next;
+            if(next != null) {
+                next.prev = prev;
+                next = null;
+            }
+            prev = null;
+        }
+    }
     
     TMetaVar(Kind kind) {
         this.kind = kind;
@@ -115,13 +141,22 @@ public class TMetaVar extends Type {
             ref.collectEffectMetaVars(vars);
     }
 
-    public void setRef(Type a) throws UnificationException {
-        a = Types.weakCanonical(a);
-        if(a.contains(this))
-            throw new UnificationException(this, a);
-        ref = a;
+    public void setRef(Type type) throws UnificationException {
+        if(DEBUG)
+            System.out.println("setRef " + System.identityHashCode(this) + " -> " + type);
+        if(ref != null)
+            throw new InternalCompilerError("Method setRef should be called only for unbound meta variables.");
+        if(type.contains(this))
+            throw new UnificationException(this, type);
+        ref = type;
         if(polarity != Polarity.NO_POLARITY)
-            a.addPolarity(polarity);
+            type.addPolarity(polarity);
+        if(skeletonRef != null) {
+            Type skeleton = skeletonRef;
+            skeletonRef = null;
+            Skeletons.unifySkeletons(skeleton, type);
+        }
+        fireNotifyAboutChange();
     }
     
     public Type getRef() {
@@ -130,10 +165,12 @@ public class TMetaVar extends Type {
     
     @Override
     public boolean contains(TMetaVar other) {
-        if(ref == null)
-            return this == other;
-        else
+        if(ref != null)
             return ref.contains(other);
+        else if(skeletonRef != null)
+            return skeletonRef.contains(other);
+        else
+            return this == other;
     }
     
     @Override
@@ -231,4 +268,79 @@ public class TMetaVar extends Type {
             return result;
         }
     }
+
+    public void setSkeletonRef(Type type) throws UnificationException {
+        if(DEBUG)
+            System.out.println("setSkeletonRef " +  System.identityHashCode(this) + " -> " + type);
+        if(ref != null || skeletonRef != null)
+            throw new InternalCompilerError("Method setRef should be called only for unbound meta variables.");
+        if(type.contains(this))
+            throw new UnificationException(this, type);
+        this.skeletonRef = type;
+        fireNotifyAboutChange();
+    }
+    
+    @Override
+    public int hashCode(int hash) {
+        if(ref == null)
+            return HashCodeUtils.update(hash, System.identityHashCode(this));
+        else
+            return ref.hashCode(hash);
+    }
+    
+    @Override
+    public int hashCode(int hash, TVar[] boundVars) {
+        if(ref == null)
+            return HashCodeUtils.update(hash, System.identityHashCode(this));
+        else
+            return ref.hashCode(hash, boundVars);
+    }
+    
+    @Override
+    public boolean equalsCanonical(Type other) {
+        return this == other;
+    }
+    
+    @Override
+    public Type canonical() {
+        if(ref == null)
+            return this;
+        else
+            return ref = ref.canonical();
+    }
+    
+    public void addListener(TMetaVarListener newListener) {
+        if(DEBUG)
+            System.out.println("addListener " + System.identityHashCode(this));
+        newListener.next = listener;
+        newListener.prev = this;
+        if(listener != null)
+            listener.prev = newListener;
+        listener = newListener;
+    }
+    
+    private void fireNotifyAboutChange() {
+        if(DEBUG)
+            System.out.println("fireNotifyAboutChange " + System.identityHashCode(this) + " " + ref);
+        TMetaVarListener cur = listener;
+        listener = null;
+        while(cur != null) {
+            if(DEBUG)
+                System.out.println("    call listener");
+            cur.prev = null; // This prevents TMetaVarListener.remove from doing anything
+            cur.notifyAboutChange();
+            TMetaVarListener next = cur.next;
+            cur.next = null;
+            cur = next;
+        }
+    }
+    
+    public TMetaVarListener getLatestListener() {
+        return listener;
+    }
+
+    @Override
+    public Kind getKind(Environment context) {
+        return kind;
+    }
 }
index d9fd79f917f3770b7f730caaacd9017d5aba348f..e8a0469c5d996f428c205c13018fe1e6e009707c 100644 (file)
@@ -1,11 +1,9 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TApplyAst;
 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
@@ -15,6 +13,9 @@ import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 
 
 public class TPred extends Type {
@@ -172,4 +173,42 @@ public class TPred extends Type {
             newParameters[i] = parameters[i].copySkeleton(metaVarMap);
         return new TPred(typeClass, parameters);
     }
+    
+    @Override
+    public int hashCode(int hash) {
+        hash = HashCodeUtils.updateWithPreprocessedValue(hash, PRED_HASH);
+        hash = typeClass.hashCode(hash);
+        for(Type parameter : parameters)
+            hash = parameter.hashCode(hash);
+        return hash;
+    }
+    
+    @Override
+    public int hashCode(int hash, TVar[] boundVars) {
+        hash = HashCodeUtils.updateWithPreprocessedValue(hash, PRED_HASH);
+        hash = typeClass.hashCode(hash, boundVars);
+        for(Type parameter : parameters)
+            hash = parameter.hashCode(hash, boundVars);
+        return hash;
+    }
+
+    @Override
+    public boolean equalsCanonical(Type other) {
+        if(this == other)
+            return true;
+        if(!other.getClass().equals(TPred.class))
+            return false;
+        TPred pred = (TPred)other;
+        if(typeClass != pred.typeClass || parameters.length != pred.parameters.length)
+            return false;
+        for(int i=0;i<parameters.length;++i)
+            if(!Types.canonical(parameters[i]).equalsCanonical(Types.canonical(pred.parameters[i])))
+                return false;
+        return true;
+    }
+
+    @Override
+    public Kind getKind(Environment context) {
+        return Kinds.STAR;
+    }
 }
index e14ddb3052d5f30a57177753ec32fbc01b078fff..c3d88b00d1c826416e2d6af8144db9cddacde6b6 100644 (file)
@@ -1,17 +1,21 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
+import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TConAst;
 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
+import org.simantics.scl.compiler.types.kinds.Kind;
+import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 public class TUnion extends Type {    
     public final Type[] effects;
 
@@ -164,4 +168,64 @@ public class TUnion extends Type {
     public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {
         return Types.NO_EFFECTS;
     }
+    
+    @Override
+    public int hashCode(int hash) {
+        int sum = UNION_HASH;
+        for(Type effect : effects)
+            sum += effect.hashCode(HashCodeUtils.SEED);
+        return HashCodeUtils.updateWithPreprocessedValue(hash, sum);
+    }
+    
+    @Override
+    public int hashCode(int hash, TVar[] boundVars) {
+        int sum = UNION_HASH;
+        for(Type effect : effects)
+            sum += effect.hashCode(HashCodeUtils.SEED, boundVars);
+        return HashCodeUtils.updateWithPreprocessedValue(hash, sum);
+    }
+    
+    @Override
+    public boolean equalsCanonical(Type other) {
+        if(this == other)
+            return true;
+        if(!other.getClass().equals(TUnion.class))
+            return false;
+        TUnion union = (TUnion)other;
+        int length = effects.length;
+        if(length != union.effects.length)
+            return false;
+        if(length == 0)
+            return true;
+        for(int i=0;i<length;++i) {
+            effects[i] = effects[i].canonical();
+            union.effects[i] = union.effects[i].canonical();
+        }
+        if(length == 2) {
+            if(effects[0].equalsCanonical(union.effects[0]))
+                return effects[1].equalsCanonical(union.effects[1]);
+            else
+                return effects[0].equalsCanonical(union.effects[1]) &&
+                        effects[1].equalsCanonical(union.effects[0]);
+        }
+        loop: for(int i=0;i<length;++i) {
+            Type effect = effects[i]; 
+            for(int j=i;j<length;++j)
+                if(effect.equalsCanonical(union.effects[j])) {
+                    if(j > i) {
+                        effect = union.effects[i];
+                        union.effects[i] = union.effects[j];
+                        union.effects[j] = effect;
+                    }
+                    continue loop;
+                }
+            return false;
+        }
+        return true;
+    }
+    
+    @Override
+    public Kind getKind(Environment context) {
+        return Kinds.EFFECT;
+    }
 }
index 1fca6c59aa4b884fa6679dc68390e17ff82d2865..aeb9711453800ff1fce03878743880e613092d9b 100644 (file)
@@ -1,12 +1,9 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 
 import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TVarAst;
 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
@@ -17,8 +14,12 @@ import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.THashSet;
+
 
-public class TVar extends Type {
+public final class TVar extends Type {
     public static final TVar[] EMPTY_ARRAY = new TVar[0];
     
     private Kind kind;
@@ -139,4 +140,29 @@ public class TVar extends Type {
     public Type copySkeleton(THashMap<TMetaVar, TMetaVar> metaVarMap) {
         return this;
     }
+    
+    @Override
+    public int hashCode(int hash) {
+        return HashCodeUtils.update(hash, System.identityHashCode(this));
+    }
+    
+    @Override
+    public int hashCode(int hash, TVar[] boundVars) {
+        for(int i=0;i<boundVars.length;++i)
+            if(boundVars[i] == this) {
+                hash = HashCodeUtils.updateWithPreprocessedValue(hash, BOUND_VAR_HASH);
+                return HashCodeUtils.update(hash, i);
+            }
+        return HashCodeUtils.update(hash, System.identityHashCode(this));
+    }
+    
+    @Override
+    public boolean equalsCanonical(Type other) {
+        return this == other;
+    }
+
+    @Override
+    public Kind getKind(Environment context) {
+        return kind;
+    }
 }
index 1709ebbeeeab415361894829982922bf8201bc13..386accc4ff5e1e941d84a1b84768740d81558877 100644 (file)
@@ -1,12 +1,10 @@
 package org.simantics.scl.compiler.types;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.set.hash.THashSet;
-
 import java.util.ArrayList;
 import java.util.Map;
 
 import org.simantics.scl.compiler.environment.Environment;
+import org.simantics.scl.compiler.internal.types.HashCodeUtils;
 import org.simantics.scl.compiler.internal.types.TypeHashCodeContext;
 import org.simantics.scl.compiler.internal.types.ast.TypeAst;
 import org.simantics.scl.compiler.types.exceptions.KindUnificationException;
@@ -16,6 +14,9 @@ import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Polarity;
 import org.simantics.scl.compiler.types.util.TypeUnparsingContext;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
 
 
 /**
@@ -37,8 +38,13 @@ public abstract class Type {
     public static final int METAVAR_ID = 5;
     public static final int VAR_ID = 6;
     public static final int UNION_ID = 7;
-    public static final int ALIAS_ID = 8;
     
+    protected static final int APPLY_HASH = HashCodeUtils.preprocessValue(0);
+    protected static final int FORALL_HASH = HashCodeUtils.preprocessValue(1);
+    protected static final int FUN_HASH = HashCodeUtils.preprocessValue(2);
+    protected static final int PRED_HASH = HashCodeUtils.preprocessValue(3);
+    protected static final int UNION_HASH = HashCodeUtils.preprocessValue(4);
+    protected static final int BOUND_VAR_HASH = HashCodeUtils.preprocessValue(5);
     
     /*
      * This class is not meant to be extended outside of this package. 
@@ -107,12 +113,12 @@ public abstract class Type {
     
     @Override
     public int hashCode() {
-        TypeHashCodeContext context = new TypeHashCodeContext();
-        updateHashCode(context);
-        return context.getResult();
+        return hashCode(HashCodeUtils.SEED);
     }
     
     public abstract void updateHashCode(TypeHashCodeContext context);
+    public abstract int hashCode(int hash);
+    public abstract int hashCode(int hash, TVar[] boundVars);
 
     public abstract void collectFreeVars(ArrayList<TVar> vars);
     
@@ -160,5 +166,13 @@ public abstract class Type {
      * Creates an independent copy of the type, but replaces all effects by metavars
      */
     public abstract Type copySkeleton(THashMap<TMetaVar,TMetaVar> metaVarMap);
+    
+    public abstract boolean equalsCanonical(Type other);
+    
+    public Type canonical() {
+        return this;
+    }
+
+    public abstract Kind getKind(Environment context);
 
 }
\ No newline at end of file
index a706e2b8f17d3d9415b30c3ccd7eed14ea01b1f9..f0c9dbddfb2e1383ff746aa9b1a1ce7f1f12e552 100644 (file)
@@ -147,29 +147,9 @@ public class Types {
             function = apply(function, parameter);
         return function;
     }
-
-    /**
-     * Get the concrete type or alias type pointed to by a chain of type meta-variables,
-     * or the last metavariable in the link, if it is not linked to an actual type.
-     * Unlike {@link #canonical(Type)}, this method does not resolve type aliases. 
-     */
-    public static Type weakCanonical(Type type) {
-        while(true) {
-            if(type instanceof TMetaVar) {
-                TMetaVar metaVar = (TMetaVar)type;
-                if(metaVar.ref == null)
-                    return type;
-                else
-                    type = metaVar.ref;
-            }
-            else
-                return type;
-        }
-    }
     
     /**
-     * Get the concrete type pointed to by a chain of type meta-variables. Unlike {@link #weakCanonical(Type)}
-     * this method also resolves type aliases.
+     * Get the concrete type pointed to by a chain of type meta-variables.
      */
     public static Type canonical(Type type) {
         while(type instanceof TMetaVar) {
@@ -795,8 +775,8 @@ public class Types {
     }
 
     public static void unify(Type a, Type b) throws UnificationException {
-        a = weakCanonical(a);
-        b = weakCanonical(b);
+        a = canonical(a);
+        b = canonical(b);
         if(a == b)
             return;
         if(a instanceof TMetaVar) {
@@ -1137,4 +1117,30 @@ public class Types {
                     e.getMessage()));
         }
     }
+
+    public static Type instantiateAndStrip(Type type) {
+        while(true) {
+            if(type instanceof TForAll) {
+                TForAll forAll = (TForAll)type;
+                type = forAll.type.replace(forAll.var, metaVar(forAll.var.getKind()));
+            }
+            else if(type instanceof TFun) {
+                TFun fun = (TFun)type;
+                if(fun.domain instanceof TPred || fun.domain == Types.PUNIT)
+                    type = fun.range;
+                else
+                    return type;
+            }
+            else if(type instanceof TMetaVar) {
+                TMetaVar metaVar = (TMetaVar)type;
+                if(metaVar.ref == null)
+                    return type;
+                else
+                    type = metaVar.ref;
+            }
+            else
+                return type;
+        }
+    }
+    
 }
index edf63df740a4d871910eddde4be0708341f09ab9..4707110f8d9f374af01c761fb1200038d7a5f1ce 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.types.kinds;
 
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.types.exceptions.KindUnificationException;
 
 public class Kinds {
@@ -77,5 +78,24 @@ public class Kinds {
 
     public static boolean equals(Kind a, Kind b) {
         return equalsCanonical(canonical(a), canonical(b));
+    }
+
+    public static Kind rangeOfArrow(Kind kind) {
+        kind = canonical(kind);
+        if(kind instanceof KArrow)
+            return ((KArrow)kind).range;
+        else if(kind instanceof KMetaVar) {
+            Kind domain = Kinds.metaVar();
+            Kind range = Kinds.metaVar();
+            try {
+                ((KMetaVar)kind).setRef(arrow(domain, range));
+            } catch (KindUnificationException e) {
+                // Should not fail because kind is canonical
+                e.printStackTrace();
+            }
+            return range;
+        }
+        else
+            throw new InternalCompilerError("Assumed arrow kind but encountered " + kind + ".");
     }    
 }
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeListener.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeListener.java
new file mode 100644 (file)
index 0000000..04c9e16
--- /dev/null
@@ -0,0 +1,63 @@
+package org.simantics.scl.compiler.types.util;
+
+import java.util.ArrayList;
+
+import org.simantics.scl.compiler.types.Skeletons;
+import org.simantics.scl.compiler.types.TApply;
+import org.simantics.scl.compiler.types.TForAll;
+import org.simantics.scl.compiler.types.TFun;
+import org.simantics.scl.compiler.types.TMetaVar;
+import org.simantics.scl.compiler.types.TMetaVar.TMetaVarListener;
+import org.simantics.scl.compiler.types.TPred;
+import org.simantics.scl.compiler.types.Type;
+
+public abstract class TypeListener {
+    private ArrayList<TMetaVarListener> metaVarListeners = new ArrayList<TMetaVarListener>(2);
+    public abstract void notifyAboutChange();
+    
+    private static class SubListener extends TMetaVarListener {
+        private final TypeListener parent;
+        public SubListener(TypeListener parent) {
+            this.parent = parent;
+        }        @Override
+        public void notifyAboutChange() {
+            for(TMetaVarListener otherListeners : parent.metaVarListeners)
+                otherListeners.remove();
+            parent.notifyAboutChange();
+        }
+    };
+    
+    public void listenSkeleton(Type type) {
+        type = Skeletons.canonicalSkeleton(type);
+        if(type instanceof TMetaVar) {
+            TMetaVar metaVar = (TMetaVar)type;
+            TMetaVarListener latestListener = metaVar.getLatestListener();
+            if(latestListener instanceof SubListener &&
+                    ((SubListener)latestListener).parent == this)
+                return;
+            
+            SubListener subListener = new SubListener(this);
+            metaVarListeners.add(subListener);
+            metaVar.addListener(subListener);
+        }
+        else if(type instanceof TApply) {
+            TApply apply = (TApply)type;
+            listenSkeleton(apply.function);
+            listenSkeleton(apply.parameter);
+        }
+        else if(type instanceof TFun) {
+            TFun fun = (TFun)type;
+            listenSkeleton(fun.domain);
+            listenSkeleton(fun.range);
+        }
+        else if(type instanceof TForAll) {
+            TForAll forAll = (TForAll)type;
+            listenSkeleton(forAll.type);
+        }
+        else if(type instanceof TPred) {
+            TPred pred = (TPred)type;
+            for(Type parameter : pred.parameters)
+                listenSkeleton(parameter);
+        }
+    }
+}
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeTree.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/util/TypeTree.java
new file mode 100644 (file)
index 0000000..b41dba8
--- /dev/null
@@ -0,0 +1,70 @@
+package org.simantics.scl.compiler.types.util;\r
+\r
+import org.simantics.scl.compiler.types.Skeletons;\r
+import org.simantics.scl.compiler.types.TMetaVar;\r
+import org.simantics.scl.compiler.types.Type;\r
+\r
+public class TypeTree<T> {\r
+    \r
+    public static class Case<T> {\r
+        public Type[] types;\r
+        public T result;\r
+    }\r
+    \r
+    private static class Node<T> {\r
+        Case<T>[] cases;\r
+        Branch<T>[] branches;\r
+\r
+        public Node(Case<T>[] cases) {\r
+            this.cases = cases;\r
+            this.branches = new Branch[cases[0].types.length];\r
+        }\r
+        \r
+        Branch<T> getBranch(int i) {\r
+            // TODO\r
+            return null;\r
+        }\r
+    }\r
+    \r
+    private static class Branch<T> {\r
+\r
+        public void improve(Iterator<T> iterator) {\r
+            // TODO Auto-generated method stub\r
+            \r
+        }\r
+        \r
+    }\r
+    \r
+    public static class Iterator<T> {\r
+        Node<T> node;\r
+        Type[] scrutinee;\r
+        \r
+        public Iterator(Node<T> node, Type[] scrutinee) {\r
+            this.node = node;\r
+            this.scrutinee = scrutinee;\r
+        }\r
+        \r
+        public void improve() {\r
+            for(int i=0;i<scrutinee.length;++i) {\r
+                Type type = scrutinee[i] = Skeletons.canonicalSkeleton(scrutinee[i]);\r
+                if(!(type instanceof TMetaVar)) {\r
+                   Branch<T> branch = node.getBranch(i);\r
+                   if(branch != null) {\r
+                       branch.improve(this);\r
+                       --i;\r
+                   }\r
+                }\r
+            }\r
+        }\r
+    }\r
+    \r
+    Node<T> root;\r
+    \r
+    public TypeTree(Case<T>[] cases) {\r
+        this.root = new Node<T>(cases);\r
+    }\r
+    \r
+    public Iterator<T> iterator(Type ... scrutinee) {\r
+        return new Iterator<T>(root, scrutinee);\r
+    }\r
+}\r
index b80577e5371ad7f4feaad6549de48d5c9367b0ca..0b7b52e2938a58cd0926ad8b1c0a50bab5151d17 100644 (file)
@@ -8,15 +8,12 @@ public class ActiveTests extends TestBase {
     public ActiveTests() { super("scl"); }
 
     @Test public void Equations1() { test(); }
-    @Test public void Equality() { test(); }
-    @Test public void ModuleInitialization() { test(); }
-
-    @Test public void ImportJavaConstructor() { test(); }
-    @Test public void MarketModel() { test(); }
     @Test public void MarketModel2() { test(); }
-    @Ignore
+    @Test public void Overloading2() { test(); }
+    @Test public void Overloading3() { test(); }
+    //@Ignore
     @Test public void PatternError() { test(); }
-    @Test public void TypeAliasRefsToTypeAlias() { test(); }
+    @Test public void Serialization() { test(); }
     @Ignore
     @Test public void TypeClass2() { test(); }
     @Test public void TypeClassBug2() { test(); }
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FindAllowedChars.java b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FindAllowedChars.java
new file mode 100644 (file)
index 0000000..1e40786
--- /dev/null
@@ -0,0 +1,66 @@
+package org.simantics.scl.compiler.tests;\r
+\r
+import java.lang.reflect.Method;\r
+\r
+import org.objectweb.asm.ClassWriter;\r
+import org.objectweb.asm.MethodVisitor;\r
+import org.objectweb.asm.Opcodes;\r
+\r
+public class FindAllowedChars {\r
+    public static class MyClassLoader extends ClassLoader {\r
+        final String className;\r
+        final byte[] classBytes;\r
+        \r
+        public MyClassLoader(ClassLoader parent, String className, byte[] classBytes) {\r
+            super(parent);\r
+            this.className = className;\r
+            this.classBytes = classBytes;\r
+        }\r
+        \r
+        public MyClassLoader(String className, byte[] classBytes) {\r
+            this.className = className;\r
+            this.classBytes = classBytes;\r
+        }\r
+\r
+        @Override\r
+        protected Class<?> findClass(String name) throws ClassNotFoundException {\r
+            if(name.equals(name))\r
+                return defineClass(name, classBytes, 0, classBytes.length);\r
+            else\r
+                return super.findClass(name);\r
+        }\r
+    }\r
+    \r
+    public static void test(String className, String methodName) throws Exception {\r
+        ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);\r
+        classWriter.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);\r
+        \r
+        MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, methodName, "()V", null, null);\r
+        /*methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");\r
+        methodVisitor.visitLdcInsn("Hello world!");\r
+        methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);*/\r
+        methodVisitor.visitInsn(Opcodes.RETURN);\r
+        methodVisitor.visitMaxs(0, 0);\r
+        methodVisitor.visitEnd();\r
+        classWriter.visitEnd();\r
\r
+        ClassLoader loader = new MyClassLoader(className, classWriter.toByteArray());\r
+        Class<?> clazz = loader.loadClass(className);\r
+        Method method = clazz.getMethod(methodName);\r
+        method.invoke(null);\r
+    }\r
+    \r
+    public static void main(String[] args) throws Exception {\r
+        for(int a=Character.MIN_VALUE;a<Character.MAX_VALUE;++a) {\r
+            //for(char b=0;b<256;++b) {\r
+                String name = new String(new char[] {(char)a});\r
+                try {\r
+                    test(name, "test");\r
+                } catch(Throwable e) {\r
+                    System.out.println(name + " (" + a + ")");\r
+                }\r
+            //}   \r
+        }\r
+        System.out.println((int)Character.MAX_VALUE);\r
+    }\r
+}\r
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FutureTests.java b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/FutureTests.java
deleted file mode 100644 (file)
index 5b37fc5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.simantics.scl.compiler.tests;
-
-import org.junit.Test;
-
-public class FutureTests extends TestBase {
-    
-    public FutureTests() { super("scl"); }
-    
-    @Test public void BigInstances() { test(); }    
-    @Test public void Matching3() { test(); }
-    @Test public void Seq() { test(); }
-    
-}
similarity index 51%
rename from bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/RegressionTestsWithoutPrelude.java
rename to bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/ModuleRegressionTests.java
index 4794304ca939ddd6d08568da0db1c179f1a5a32a..286d0f910868c883ecc2adfb9884ca2a51df6889 100644 (file)
@@ -1,27 +1,44 @@
 package org.simantics.scl.compiler.tests;
 
+import org.junit.AfterClass;
 import org.junit.Test;
+import org.simantics.scl.compiler.errors.Failable;
+import org.simantics.scl.compiler.module.Module;
+import org.simantics.scl.compiler.module.coverage.CoverageUtils;
+import org.simantics.scl.compiler.module.coverage.ModuleCoverage;
 import org.simantics.scl.compiler.top.ValueNotFound;
+import org.simantics.scl.runtime.profiling.BranchPoint;
 
-public class RegressionTestsWithoutPrelude extends TestBase {
-    
-    public RegressionTestsWithoutPrelude() { super("scl"); }
+public class ModuleRegressionTests extends TestBase {
+
+    public ModuleRegressionTests() { super("scl"); }
     
     @Test public void AmbiguousType() { test(); }
     @Test public void ApplicationOfNunfunction() { test(); }
     @Test public void Arity1() { test(); }
     @Test public void AsPattern() { test(); }
+    @Test public void BigContext() { test(); }
+    @Test public void BigFunction() { test(); }
+    @Test public void BinaryOperators1() { test(); }
     @Test public void BooleanId() { test(); }
+    @Test public void Bug4450() { test(); }
+    @Test public void Character1() { test(); }
     @Test public void ClashingClass() { test(); }
     @Test public void ClashingData() { test(); }
     @Test public void ClashingInstance() { test(); }
     @Test public void ClashingValueType() { test(); }
+    @Test public void Collaz() { test(); }
     @Test public void Compose() { test(); }
     @Test public void Composition() { test(); }
     @Test public void ConjunctionMacro() { test(); }
     @Test public void Constant() { test(); }
     @Test public void ConstructorNameClash() { test(); }
     @Test public void DefaultMethods1() { test(); }
+    @Test public void Deriving3() { test(); }
+    @Test public void Deriving4() { test(); }
+    @Test public void DifferentBranchTypes() { test(); }
+    @Test public void Div() { test(); }
+    @Test public void DoubleConversion() { test(); }
     @Test public void DoubleEffect() { test(); }    
     @Test public void Effects1() { test(); }
     @Test public void Effects2() { test(); }  
@@ -31,27 +48,48 @@ public class RegressionTestsWithoutPrelude extends TestBase {
     @Test public void Effects6() { test(); }
     @Test(expected=ValueNotFound.class) 
     public void EmptyModule() throws ValueNotFound {
-        test("EmptyModule", "");
+        test(new String[]{"EmptyModule"}, new String[]{""});
     }
+    @Test public void Equality() { test(); }
     @Test public void ExistentialData() { test(); }
     @Test public void ExistentialData2() { test(); }
+    @Test public void ExpressionParsing() { test(); }
     @Test public void FaultyRecursion() { test(); }
     @Test public void Fibonacci() { test(); }
+    @Test public void Fibonacci2() { test(); }
     @Test public void Fibonacci3() { test(); }
     @Test public void FingerTree() { test(); }
+    @Test public void FoldMissingInitialValue() { test(); }
+    @Test public void FoldlBuild1() { test(); }
+    @Test public void FoldlBuild2() { test(); }
     @Test public void Forall1() { test(); }
     @Test public void Forall2() { test(); }
     @Test public void Forall3() { test(); }
+    @Test public void Formula() { test(); }
+    @Test public void FromDynamic() { test(); }
+    @Test public void FromDynamic2() { test(); }
+    @Test public void FromDynamic3() { test(); }
+    @Test public void FromDynamic4() { test(); }
+    @Test public void FromDynamic5() { test(); }
+    @Test public void FunctionFunctor() { test(); }
     @Test public void Functor() { test(); }
+    @Test public void FunctorM1() { test(); }
     @Test public void Generalization() { test(); }
+    @Test public void GenericMutualRecursion() { test(); }
+    @Test public void GlobalVariables() { test(); }
     @Test public void GuardedExpressionBug() { test(); }
+    @Test public void Guards1() { test(); }
+    @Test public void Guards2() { test(); }
     @Test public void IdAsOperator() { test(); }    
     @Test public void IllegalChar() { test(); }
+    @Test public void ImportJavaConstructor() { test(); }
     @Test public void ImportRef() { test(); }
     @Test public void InconsistentArity() { test(); }
     @Test public void InconsistentIndentation() { test(); }
     @Test public void IndentationAndParenthesis() { test(); }
+    @Test public void Index() { test(); }
     @Test public void Inline1() { test(); }
+    @Test public void InstanceHierarchy() { test(); }
     @Test public void InstanceIsTypoedAsClass() { test(); }
     @Test public void InvalidClass1() { test(); }
     @Test public void InvalidEncoding() { test(); }
@@ -61,6 +99,7 @@ public class RegressionTestsWithoutPrelude extends TestBase {
     @Test public void InvalidKinds2() { test(); }
     @Test public void InvalidKinds3() { test(); }
     @Test public void InvalidLambda() { test(); }
+    @Test public void InvalidModule() { test(); }
     @Test public void InvalidPattern1() { test(); }
     @Test public void InvalidPattern2() { test(); }
     @Test public void InvalidPattern3() { test(); }
@@ -72,31 +111,55 @@ public class RegressionTestsWithoutPrelude extends TestBase {
     @Test public void JavaTypes() { test(); }
     @Test public void Kinds1() { test(); }
     @Test public void Lambda() { test(); }
+    @Test public void Layout1() { test(); }
     @Test public void List() { test(); }
     @Test public void ListError1() { test(); }
     @Test public void ListError2() { test(); }    
+    @Test public void ListSyntax() { test(); }
+    @Test public void ListSyntax10() { test(); }
+    @Test public void ListSyntax11() { test(); }
+    @Test public void ListSyntax12() { test(); }
+    @Test public void ListSyntax2() { test(); }
+    @Test public void ListSyntax3() { test(); }
+    @Test public void ListSyntax4() { test(); }
+    @Test public void ListSyntax5() { test(); }
+    @Test public void ListSyntax6() { test(); }
+    @Test public void ListSyntax7() { test(); }
+    @Test public void ListSyntax8() { test(); }
+    @Test public void ListSyntax9() { test(); }
     @Test public void ListSyntaxWithoutPrelude() { test(); }
     @Test public void LocalDefinitions() { test(); }
     @Test public void LocalDefinitions2() { test(); }
     @Test public void LocalDefinitions3() { test(); }
     @Test public void LocalDefinitions4() { test(); }
+    @Test public void LocalDefinitions5() { test(); }
     @Test public void Macros1() { test(); }
     @Test public void Macros2() { test(); }
     @Test public void Macros4() { test(); }
     @Test public void Map1() { test(); }
+    @Test public void MarketModel() { test(); }    
     @Test public void Matching() { test(); }
     @Test public void Matching2() { test(); }
-    @Test public void Matching5() { test(); }    
+    @Test public void Matching4() { test(); }
+    @Test public void Matching5() { test(); }
+    @Test public void MatchingWithMissingParameter() { test(); }
     @Test public void MatchingWithoutTypeAnnotations() { test(); }
+    @Test public void MaximumBy() { test(); }
     @Test public void Maybe1() { test(); }
     @Test public void Maybe2() { test(); }
     @Test public void Maybe3() { test(); }    
+    @Test public void Maybe4() { test(); }
+    @Test public void MissingEffect() { test(); }
     @Test public void MissingMethod() { test(); }
+    @Test public void ModuleInitialization() { test(); }
     @Test public void MonadBug1() { test(); }
+    @Test public void MonadSyntax1() { test(); }
+    @Test public void Monads1() { test(); }
     @Test public void NoDefinitionErrorMessage() { test(); }    
     @Test public void NoInstance() { test(); }
     @Test public void NoInstance2() { test(); }
     @Test public void NonassociativeOperator() { test(); }
+    @Test public void NonexistentTypeClassInAnnotation() { test(); }
     @Test public void NonexistingEffect() { test(); }
     @Test public void OneLineMatch() { test(); }    
     @Test public void OpenString1() { test(); }
@@ -104,36 +167,85 @@ public class RegressionTestsWithoutPrelude extends TestBase {
     @Test public void OverloadedArithmetic1() { test(); }
     @Test public void OverloadedArithmetic2() { test(); }
     @Test public void OverloadedArithmetic3() { test(); }
+    @Test public void OverloadedLiterals2() { test(); }
+    @Test public void Overloading1() { test(); }
+    @Test public void Parsing() { test(); }    
     @Test public void PolymorphicRecursion() { test(); }
     @Test public void PolymorphicRecursion2() { test(); }
+    @Test public void Polynomials() { test(); }
     @Test public void PrecedenceOfNonoperators() { test(); }    
     @Test public void Primes() { test(); }
+    @Test public void Proc1() { test(); }
+    @Test public void Proc2() { test(); }
+    @Test public void Proc3() { test(); }
     @Test public void Pythagoras() { test(); }
+    @Test public void Random1() { test(); }
+    @Test public void RangeSyntax() { test(); }
+    @Test public void Record1() { test(); }
+    @Test public void RecordShorthand() { test(); }
     @Test public void RecursiveContext() { test(); }
     @Test public void RecursiveValues2() { test(); }
     @Test public void RecursiveValues3() { test(); }
     @Test public void RecursiveValues4() { test(); }
+    @Test public void RedBlackTrees() { test(); }
+    @Test public void Relations1() { test(); }
+    @Test public void Relations2() { test(); }
     @Test public void RepeatedVariableInPattern() { test(); }    
+    @Test public void SSATypingBug() { test(); }
+    @Test public void Scanl() { test(); }
+    @Test public void Search() { test(); }
+    @Test public void Sections() { test(); }
+    @Test public void Select1() { test(); }
+    @Test public void Select2() { test(); }
+    @Test public void Select3() { test(); }
+    @Test public void Select4() { test(); }
+    @Test public void Select5() { test(); }
+    @Test public void Select6() { test(); }
+    @Test public void Select7() { test(); }
+    @Test public void Select8() { test(); }
+    @Test public void Select9() { test(); }
     @Test public void SelfReferringContextInTypeClass() { test(); }
+    @Test public void Serialization2() { test(); }
+    @Test public void Serialization3() { test(); }
     @Test public void SharedTypeVariable() { test(); }
     @Test public void ShortcutFusion() { test(); }
+    @Test public void Show1() { test(); }
+    @Test public void SinConst1() { test(); }
+    @Test public void Sort() { test(); }
     @Test public void Sort2() { test(); }
     @Test public void StreamFusion() { test(); }
+    @Test public void StringEscape() { test(); }
+    @Test public void StringInterpolation1() { test(); }
     @Test public void StringMatching1() { test(); }    
+    @Test public void SumOfInverses2() { test(); }
+    @Test public void TooManyParametersToSin() { test(); }
+    @Test public void Transformation1() { test(); }
+    @Test public void Transformation2() { test(); }
+    @Test public void Transformation3() { test(); }
+    @Test public void Transformation4() { test(); }
+    @Test public void Transformation5() { test(); }
+    @Test public void Transformation6() { test(); }
+    @Test public void Transformation7() { test(); }
+    @Test public void TransformationOrder() { test(); }
     @Test public void Tuples() { test(); }
     @Test public void Tuples2() { test(); }
     @Test public void TypeAlias1() { test(); }
     @Test public void TypeAlias2() { test(); }
     @Test public void TypeAlias3() { test(); }
+    @Test public void TypeAliasRefsToTypeAlias() { test(); }
     @Test public void TypeAnnotation1() { test(); }
     @Test public void TypeAnnotation2() { test(); }
     @Test public void TypeClass() { test(); }
     @Test public void TypeClassBug1() { test(); }    
+    @Test(timeout=1000L) public void TypeInferenceBug2() { test(); }
+    @Test public void TypeOf1() { test(); }
     @Test public void TypingBug1() { test(); }
     @Test public void TypingError1() { test(); }
     @Test public void TypingError2() { test(); }
+    @Test public void UnaryMinus() { test(); }
     @Test public void UndefinedValue() { test(); }
     @Test public void UnexpectedToken() { test(); }
+    @Test public void Unification1() { test(); }
     @Test public void UnknownAnnotation() { test(); }
     @Test public void UnresolvedClass() { test(); }
     @Test public void UnresolvedTypeInAnnotation() { test(); }
@@ -141,11 +253,38 @@ public class RegressionTestsWithoutPrelude extends TestBase {
     @Test public void UnresolvedVariable() { test(); }
     @Test public void UnresolvedVariable2() { test(); }   
     @Test public void ValueAsOperator() { test(); }
+    @Test public void ValueConversion() { test(); }
+    @Test public void Vector1() { test(); }
+    @Test public void Vector2() { test(); }
     @Test public void Void1() { test(); }
     @Test public void Void2() { test(); }
     @Test public void Void3() { test(); }
     @Test public void While() { test(); }
+    @Test public void While2() { test(); }
+    @Test public void While3() { test(); }    
     @Test public void WrongDefaultMethod() { test(); }
     @Test public void WrongInstanceMethod() { test(); }
-    
+
+    @AfterClass
+    public static void checkCoverage() {
+        Failable<Module> maybeModule = PRELUDE_MODULE_REPOSITORY.getModule("Prelude");
+        if(!maybeModule.didSucceed())
+            return;
+        Module module = maybeModule.getResult();
+        ModuleCoverage coverage = CoverageUtils.getCoverage(module);
+        if(coverage == null)
+            return;
+        coverage.print(System.out);
+        printCoverageTree(module.getBranchPoints().get("lookup"), 0);
+    }
+
+    private static void printCoverageTree(BranchPoint[] branchPoints, int ind) {
+        for(BranchPoint bp : branchPoints) {
+            for(int i=0;i<ind;++i)
+                System.out.print("    ");
+            System.out.println(bp.codeSize);
+            printCoverageTree(bp.children, ind+1);
+        }
+    }
+
 }
index 17a4f7ec8f022956396ffda5c11faa42afe86644..1f397fe333b948a80029e0d02c46d215f41780bb 100644 (file)
@@ -6,8 +6,7 @@ import org.junit.runners.Suite.SuiteClasses;
 
 @RunWith(Suite.class)
 @SuiteClasses({
-    RegressionTestsWithoutPrelude.class, 
-    RegressionTestsWithPrelude.class,
+    ModuleRegressionTests.class,
     TestExpressionEvaluator.class,
     TestCommandSession.class
 })
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/RegressionTestsWithPrelude.java b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/RegressionTestsWithPrelude.java
deleted file mode 100644 (file)
index 76d58fe..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.simantics.scl.compiler.tests;
-
-import org.junit.Test;
-
-public class RegressionTestsWithPrelude extends TestBase {
-
-    public RegressionTestsWithPrelude() { super("scl"); }
-
-    @Test public void BigContext() { test(); }
-    @Test public void BigFunction() { test(); }
-    @Test public void BinaryOperators1() { test(); }
-    @Test public void Bug4450() { test(); }
-    @Test public void Character1() { test(); }
-    @Test public void Collaz() { test(); }
-    @Test public void Deriving1() { test(); }
-    @Test public void Deriving3() { test(); }
-    @Test public void Deriving4() { test(); }
-    @Test public void Div() { test(); }
-    @Test public void DoubleConversion() { test(); }
-    @Test public void ExpressionParsing() { test(); }
-    @Test public void Fibonacci2() { test(); }
-    @Test public void FoldlBuild1() { test(); }
-    @Test public void FoldlBuild2() { test(); }
-    @Test public void FoldMissingInitialValue() { test(); }
-    @Test public void FromDynamic() { test(); }
-    @Test public void FromDynamic2() { test(); }
-    @Test public void FromDynamic3() { test(); }
-    @Test public void FromDynamic4() { test(); }
-    @Test public void FromDynamic5() { test(); }
-    @Test public void FunctionFunctor() { test(); }
-    @Test public void FunctorM1() { test(); }
-    @Test public void GenericMutualRecursion() { test(); }
-    @Test public void GlobalVariables() { test(); }
-    @Test public void Guards1() { test(); }
-    @Test public void Guards2() { test(); }
-    @Test public void Hashable1() { test(); }
-    @Test public void Hashable2() { test(); }
-    @Test public void Index() { test(); }
-    @Test public void InstanceHierarchy() { test(); }
-    @Test public void InvalidModule() { test(); }
-    @Test public void Layout1() { test(); }
-    @Test public void ListSyntax() { test(); }
-    @Test public void ListSyntax2() { test(); }
-    @Test public void ListSyntax3() { test(); }
-    @Test public void ListSyntax4() { test(); }
-    @Test public void ListSyntax5() { test(); }
-    @Test public void ListSyntax6() { test(); }
-    @Test public void ListSyntax7() { test(); }
-    @Test public void ListSyntax8() { test(); }
-    @Test public void ListSyntax9() { test(); }
-    @Test public void ListSyntax10() { test(); }
-    @Test public void ListSyntax11() { test(); }
-    @Test public void ListSyntax12() { test(); }
-    @Test public void LocalDefinitions5() { test(); }
-    @Test public void Matching4() { test(); }
-    @Test public void MaximumBy() { test(); }
-    @Test public void Maybe4() { test(); }
-    @Test public void MissingEffect() { test(); }
-    @Test public void Monads1() { test(); }
-    @Test public void MonadSyntax1() { test(); }
-    @Test public void NonexistentTypeClassInAnnotation() { test(); }
-    @Test public void OverloadedLiterals2() { test(); }
-    @Test public void Parsing() { test(); }    
-    @Test public void Polynomials() { test(); }
-    @Test public void Proc1() { test(); }
-    @Test public void Proc2() { test(); }
-    @Test public void Proc3() { test(); }
-    @Test public void Random1() { test(); }
-    @Test public void RangeSyntax() { test(); }
-    @Test public void Record1() { test(); }
-    @Test public void RedBlackTrees() { test(); }
-    @Test public void Relations1() { test(); }
-    @Test public void Relations2() { test(); }
-    @Test public void Scanl() { test(); }
-    @Test public void Search() { test(); }
-    @Test public void Sections() { test(); }
-    @Test public void Select1() { test(); }
-    @Test public void Select2() { test(); }
-    @Test public void Select3() { test(); }
-    @Test public void Select4() { test(); }
-    @Test public void Select5() { test(); }
-    @Test public void Select6() { test(); }
-    @Test public void Select7() { test(); }
-    @Test public void Select8() { test(); }
-    @Test public void Select9() { test(); }
-    @Test public void Serialization() { test(); }
-    @Test public void Serialization2() { test(); }
-    @Test public void Serialization3() { test(); }
-    @Test public void Show1() { test(); }
-    @Test public void SinConst1() { test(); }
-    @Test public void Sort() { test(); }
-    @Test public void SSATypingBug() { test(); }
-    @Test public void StringInterpolation1() { test(); }
-    @Test public void SumOfInverses2() { test(); }
-    @Test public void TooManyParametersToSin() { test(); }
-    @Test public void Transformation1() { test(); }
-    @Test public void Transformation2() { test(); }
-    @Test public void Transformation3() { test(); }
-    @Test public void Transformation4() { test(); }
-    @Test public void Transformation5() { test(); }
-    @Test public void Transformation6() { test(); }
-    @Test public void Transformation7() { test(); }
-    @Test public void TransformationOrder() { test(); }
-    @Test(timeout=1000L) public void TypeInferenceBug2() { test(); }
-    @Test public void TypeOf1() { test(); }
-    @Test public void UnaryMinus() { test(); }
-    @Test public void Unification1() { test(); }
-    @Test public void ValueConversion() { test(); }
-    @Test public void Vector1() { test(); }
-    @Test public void Vector2() { test(); }
-    @Test public void While2() { test(); }
-    @Test public void While3() { test(); }
-
-}
index 7a445392db34a2d38102d8de5e5040cc9e46229e..466c0978b6ec56ac57e12c2952ea7d916ab6d10e 100644 (file)
@@ -3,6 +3,7 @@ package org.simantics.scl.compiler.tests;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.regex.Pattern;
 
@@ -13,6 +14,7 @@ import org.simantics.scl.compiler.module.ImportDeclaration;
 import org.simantics.scl.compiler.module.Module;
 import org.simantics.scl.compiler.module.repository.ModuleRepository;
 import org.simantics.scl.compiler.module.repository.UpdateListener;
+import org.simantics.scl.compiler.source.ModuleSource;
 import org.simantics.scl.compiler.source.StringModuleSource;
 import org.simantics.scl.compiler.source.repository.CompositeModuleSourceRepository;
 import org.simantics.scl.compiler.source.repository.MapModuleSourceRepository;
@@ -26,7 +28,7 @@ public class TestBase {
                     SourceRepositories.BUILTIN_SOURCE_REPOSITORY,
                     SourceRepositories.PRELUDE_SOURCE_REPOSITORY
                     ));
-    private static final Pattern TEST_SEPARATOR = Pattern.compile("^-- *$", Pattern.MULTILINE);
+    private static final Pattern TEST_SEPARATOR = Pattern.compile("^--+ *$", Pattern.MULTILINE);
     private static final Charset UTF8 = Charset.forName("UTF-8");
 
     String path;
@@ -35,17 +37,36 @@ public class TestBase {
         this.path = path;
     }
     
-    
     protected void test() {
         String testModuleName = Thread.currentThread().getStackTrace()[2].getMethodName();
         String testPath = path + "/" + testModuleName + ".scl";
         
         try {
             String[] testParts = readTestParts(testPath);
-            for(int i=0;i<testParts.length;i+=2) {
-                String input = testParts[i];
-                String expectedOutput = testParts[i+1];
-                String actualOutput = test(testModuleName, input);
+            
+            int j=0;
+            ArrayList<String> auxModuleNameList = new ArrayList<String>();
+            while(j < testParts.length) {
+                String part = testParts[j]; 
+                if(part.startsWith("// module "))
+                    auxModuleNameList.add(part.substring(10).split("\\n", 2)[0].trim());
+                else
+                    break;
+                ++j;
+            }
+            int mainId = j;
+            String[] moduleNames = new String[mainId+1];
+            String[] moduleTexts = new String[mainId+1];
+            for(int i=0;i<mainId;++i) {
+                moduleNames[i] = auxModuleNameList.get(i);
+                moduleTexts[i] = testParts[i];
+            }
+            moduleNames[mainId] = testModuleName;
+            
+            for(;j<testParts.length;j+=2) {
+                moduleTexts[mainId] = testParts[j];
+                String expectedOutput = j+1<testParts.length ? testParts[j+1] : "";
+                String actualOutput = test(moduleNames, moduleTexts);
                 Assert.assertEquals(
                         canonicalizeOutput(expectedOutput),
                         canonicalizeOutput(actualOutput));
@@ -61,22 +82,32 @@ public class TestBase {
         return text.trim().replace("\r\n", "\n");
     }
 
-    protected String test(String testModuleName, String input) throws ValueNotFound {
+    protected String test(String[] moduleNames, String[] moduleTexts) throws ValueNotFound {
+        if(moduleNames.length != moduleTexts.length)
+            throw new IllegalArgumentException();
+        /*for(int i=0;i<moduleNames.length;++i) {
+            System.out.println("-- " + moduleNames[i] + " --");
+            System.out.println(moduleTexts[i]);
+        }*/
+        
+        ModuleSource[] moduleSources = new ModuleSource[moduleNames.length];
+        for(int i=0;i<moduleNames.length;++i)
+            moduleSources[i] = new StringModuleSource(
+                    moduleNames[i], getClass().getClassLoader(), moduleTexts[i]) {
+                @Override
+                protected ImportDeclaration[] getBuiltinImports(UpdateListener listener) {
+                    return ImportDeclaration.ONLY_BUILTINS;
+                }
+            };
         ModuleRepository testEnvironment = new ModuleRepository(
                 PRELUDE_MODULE_REPOSITORY,
-                new MapModuleSourceRepository(new StringModuleSource(
-                        testModuleName, getClass().getClassLoader(), input) {
-                    @Override
-                    protected ImportDeclaration[] getBuiltinImports(UpdateListener listener) {
-                        return ImportDeclaration.ONLY_BUILTINS;
-                    }
-                }
-                ));
-        Failable<Module> result = testEnvironment.getModule(testModuleName);
+                new MapModuleSourceRepository(moduleSources));
+        int lastId = moduleNames.length-1;
+        Failable<Module> result = testEnvironment.getModule(moduleNames[lastId]);
         if(!result.didSucceed())
-            return ((Failure)result).toString(input);
+            return ((Failure)result).toString(moduleTexts[lastId]);
         else {
-            Object main = testEnvironment.getRuntimeModule(testModuleName).getResult().getValue("main");
+            Object main = testEnvironment.getRuntimeModule(moduleNames[lastId]).getResult().getValue("main");
             return String.valueOf(main);
         }
     }
@@ -97,9 +128,11 @@ public class TestBase {
             }
             String text = new String(buffer, 0, pos, UTF8);
             String[] result = TEST_SEPARATOR.split(text);
-            if(result.length % 2 == 1) {
-                result = Arrays.copyOf(result, result.length+2);
-                result[result.length-1] = "";
+            for(int i=1;i<result.length;++i) {
+                if(result[i].startsWith("\r\n"))
+                    result[i] = result[i].substring(2);
+                if(result[i].startsWith("\n") || result[i].startsWith("\r"))
+                    result[i] = result[i].substring(1);
             }
             return result;
         } finally {
index e6b6e0ae68a3efdc3a99577c0155c1eb7a77c212..283e0e14e4b76c368efe479afc13bd27de12c836 100644 (file)
@@ -1,7 +1,5 @@
 package org.simantics.scl.compiler.tests;\r
 \r
-import junit.framework.Assert;\r
-\r
 import org.junit.Test;\r
 import org.simantics.scl.compiler.elaboration.java.Builtins;\r
 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;\r
@@ -15,6 +13,8 @@ import org.simantics.scl.compiler.source.repository.MapModuleSourceRepository;
 import org.simantics.scl.compiler.source.repository.ModuleSourceRepository;\r
 import org.simantics.scl.compiler.top.ExpressionEvaluator;\r
 \r
+import junit.framework.Assert;\r
+\r
 public class TestClassNaming {\r
 \r
     private static class SimpleModuleSource extends StringModuleSource {\r
index 3ed07b0e51b8e7f100b7fe8a1dce801b263dda2d..7afa6784ae097c3591f1959cdc66af1ac035010c 100644 (file)
@@ -2,8 +2,6 @@ package org.simantics.scl.compiler.tests;
 
 import java.util.Arrays;
 
-import junit.framework.Assert;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
@@ -27,6 +25,8 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.runtime.function.Function;
 import org.simantics.scl.runtime.tuple.Tuple0;
 
+import junit.framework.Assert;
+
 public class TestExpressionEvaluator {
 
     public static final boolean TIMING = false;
@@ -198,21 +198,4 @@ public class TestExpressionEvaluator {
             Assert.assertEquals(sum, result);
         }
     }
-    
-    @Test
-    public void testSeq() throws Exception {
-        String expressionText = "Sequences.runSequence mdo\n" +
-                                "  repeatForever mdo\n" +
-                                "    Sequences.wait 2\n" +
-                                "    Sequences.stop";
-        
-        try {
-            Object result = new ExpressionEvaluator(runtimeEnvironment, expressionText)
-            .parseAsBlock(true)
-            .eval();
-        } catch(SCLExpressionCompilationException e) {
-            System.out.println(CompilationErrorFormatter.toString(expressionText, e.getErrors()));
-            throw e;
-        }
-    }
 }
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/TestTypeDesc.java b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/TestTypeDesc.java
new file mode 100644 (file)
index 0000000..451dca8
--- /dev/null
@@ -0,0 +1,12 @@
+package org.simantics.scl.compiler.tests;
+
+import org.cojen.classfile.TypeDesc;
+
+public class TestTypeDesc {
+    public static void main(String[] args) {
+        System.out.println(TypeDesc.forClass(String.class).getFullName());
+        System.out.println(TypeDesc.forClass(String.class).getDescriptor());
+        System.out.println(TypeDesc.forClass(String.class).getRootName());
+
+    }
+}
index 898a9b1a811a9bf1ad38a20b3deaaeee90f81814..612a3ab1e82da58ef28b4294e333e434b75d76bc 100644 (file)
@@ -6,6 +6,7 @@ public class UnimplementedTests extends TestBase {
     
     public UnimplementedTests() { super("scl"); }
 
+    @Test public void BigInstances() { test(); }
     @Test public void BlankExpression() { test(); }
     @Test public void ClashingValueDefinition() { test(); }
     @Test public void FunctionalDependencies1() { test(); }
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Deriving1.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Deriving1.scl
deleted file mode 100644 (file)
index 6eabc62..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-import "Prelude"\r
-\r
-data Vec2 = Vec2 Double Double\r
-\r
-deriving instance Eq Vec2\r
-\r
-main = Vec2 1 1 == Vec2 1 1\r
---\r
-true
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/DifferentBranchTypes.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/DifferentBranchTypes.scl
new file mode 100644 (file)
index 0000000..2a0925f
--- /dev/null
@@ -0,0 +1,19 @@
+import "Prelude"
+
+foo n = n
+  where
+    if n > 0
+    then 1
+    else "asd"
+
+bar n = n
+  where
+    do 
+       c = n+1
+       if c > 0
+       then 1
+       else "asd"
+    
+main = foo 3 + bar 3
+--
+6
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Formula.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Formula.scl
new file mode 100644 (file)
index 0000000..10eafb0
--- /dev/null
@@ -0,0 +1,131 @@
+import "Prelude"
+
+data Formula a = TrueF
+               | FalseF
+               | XorF (Formula a) (Formula a)
+               | AndF (Formula a) (Formula a)
+               | ConditionF a
+               | NextF (Formula a)
+               | UntilF (Formula a) (Formula a)
+
+deriving instance (Ord a) => Ord (Formula a)
+
+instance (Show a) => Show (Formula a) where
+    sb <+ TrueF = sb << "true"
+    sb <+ FalseF = sb << "false"
+    sb <+ XorF a b = sb << "(" <+ a << " `XorF` " <+ b << ")"
+    sb <+ AndF a b = sb  << "(" <+ a << " &&& " <+ b << ")"
+    sb <+ ConditionF c = sb  <+ c
+    sb <+ NextF a = sb  << "(next " <+ a << ")"
+    sb <+ UntilF a b = sb << "(" <+ a << " `UntilF` " <+ b << ")"
+
+xorF FalseF f2 = f2
+xorF f1 FalseF = f1             
+xorF f1@(XorF h1 t1) f2@(XorF h2 t2) = 
+    let cmp = compare h1 h2 
+    in  if cmp < 0
+        then XorF h1 (xorF t1 f2)
+        else if cmp > 0
+        then XorF h2 (xorF f1 t2)
+        else xorF t1 t2
+xorF f1@(XorF h1 t1) f2 = 
+    let cmp = compare h1 f2
+    in  if cmp < 0
+        then XorF h1 (xorF t1 f2)
+        else if cmp > 0
+        then XorF f2 f1
+        else t1
+xorF f1 f2@(XorF h2 t2) =
+    let cmp = compare f1 h2
+    in  if cmp < 0
+        then XorF f1 f2
+        else if cmp > 0
+        then XorF h2 (xorF f1 t2)
+        else t2
+xorF f1 f2 =
+    let cmp = compare f1 f2
+    in  if cmp < 0
+        then XorF f1 f2
+        else if cmp > 0
+        then XorF f2 f1
+        else TrueF
+        
+notF f = xorF TrueF f
+
+TrueF &&& f2 = f2
+f1 &&& TrueF = f1
+FalseF &&& _ = FalseF
+_ &&& FalseF = FalseF
+XorF h1 t1 &&& f2 = xorF (h1 &&& f2) (t1 &&& f2)
+f1 &&& XorF h2 t2 = xorF (f1 &&& h2) (f1 &&& t2)
+f1@(AndF h1 t1) &&& f2@(AndF h2 t2) = 
+    let cmp = compare h1 h2 
+    in  if cmp < 0
+        then AndF h1 (t1 &&& f2)
+        else if cmp > 0
+        then AndF h2 (f1 &&& t2)
+        else AndF h1 (t1 &&& t2)
+f1@(AndF h1 t1) &&& f2 = 
+    let cmp = compare h1 f2
+    in  if cmp < 0
+        then AndF h1 (t1 &&& f2)
+        else if cmp > 0
+        then AndF f2 f1
+        else f1
+f1 &&& f2@(AndF h2 t2) =
+    let cmp = compare f1 h2
+    in  if cmp < 0
+        then AndF f1 f2
+        else if cmp > 0
+        then AndF h2 (f1 &&& t2)
+        else f2
+f1 &&& f2 =
+    let cmp = compare f1 f2
+    in  if cmp < 0
+        then AndF f1 f2
+        else if cmp > 0
+        then AndF f2 f1
+        else f1
+
+f1 ||| f2 = xorF (xorF f1 f2) (f1 &&& f2)
+        
+eval :: Ord a => (a -> <e> Boolean) -> Formula a -> <e> Formula a
+eval s TrueF = TrueF
+eval s FalseF = FalseF
+eval s (XorF f1 f2) = xorF (eval s f1) (eval s f2)
+eval s (AndF f1 f2) = eval s f1 &&& eval s f2
+eval s (ConditionF c) = if s c then TrueF else FalseF
+eval s (NextF f) = f
+eval s (UntilF f1 f2) = eval s f2 ||| (eval s f1 &&& UntilF f1 f2)
+
+// Concrete conditions
+
+data V = V String (Ref Boolean)
+
+instance Ord V where
+    compare (V a _) (V b _) = compare a b
+instance Show V where
+    sb <+ V a _ = sb <+ a 
+
+cond :: String -> Ref Boolean -> Formula V
+cond name ref = ConditionF (V name ref) 
+
+// Testing
+
+x = ref True
+y = ref False
+
+f = cond "x" x `UntilF` cond "y" y
+
+evalV = eval (\(V _ c) -> getRef c) 
+
+main = do
+    print (evalV f)
+    x := False
+    print (evalV f)
+    y = ref True
+    print (evalV f)
+    x := True
+    print (evalV f)
+--
+()
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable1.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable1.scl
deleted file mode 100644 (file)
index dc72fb0..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-import "Prelude"\r
-\r
-l :: [Integer]\r
-l = [1,2,3,4,5]\r
-main = hash l - foldl (\c x -> 31*c + x) 0 l\r
---\r
--1625180697
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable2.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Hashable2.scl
deleted file mode 100644 (file)
index ce3c5b7..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-import "Prelude"\r
-\r
-l :: [Double]\r
-l = [1,2,3,4,5]\r
-main = hash l\r
---\r
-849277455
\ No newline at end of file
index 723a017d34c1a3d9fd5d150e56c6688b27e95ef6..8897d43ddd063b8b71e25a5d674aa9d3196a6de2 100644 (file)
@@ -1,4 +1,4 @@
 
 main = \ /* no parameters */ -> 3
 --
-2:30-2:32: Unexpected token '->' (ARROW). Expected one of ATTACHED_HASH, BEGIN_STRING, BLANK, CHAR, DO, ENFORCE, ESCAPED_SYMBOL, FLOAT, ID, IF, INTEGER, LAMBDA, LBRACKET, LET, LPAREN, MATCH, MDO, SELECT, SELECT_DISTINCT, SELECT_FIRST, TRANSFORMATION, WHEN.
+2:30-2:32: Unexpected token '->' (ARROW). Expected one of ATTACHED_HASH, BEGIN_STRING, BLANK, CHAR, DO, ENFORCE, EQ, ESCAPED_SYMBOL, FLOAT, ID, IF, INTEGER, LAMBDA, LBRACKET, LET, LPAREN, MATCH, MDO, SELECT, SELECT_DISTINCT, SELECT_FIRST, TRANSFORMATION, WHEN.
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Matching3b.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Matching3b.scl
new file mode 100644 (file)
index 0000000..4864345
--- /dev/null
@@ -0,0 +1,8 @@
+import "StandardLibrary"
+
+foo 1 = "one"
+foo 2 = "two"
+
+main = if True then foo (2 :: Long) else foo (1 :: Integer)
+--
+two
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/MatchingWithMissingParameter.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/MatchingWithMissingParameter.scl
new file mode 100644 (file)
index 0000000..33a681f
--- /dev/null
@@ -0,0 +1,10 @@
+data Foo = Foo Integer Integer
+         | Bar
+         
+isFoo (Foo _) = True
+isFoo _ = False
+
+main = "Hello world!"
+--
+4:7-4:14: The function is applied with too few parameters.
+
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading1.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading1.scl
new file mode 100644 (file)
index 0000000..dfb6079
--- /dev/null
@@ -0,0 +1,19 @@
+// module Foo1
+import "Prelude"
+
+foo :: Integer -> Boolean
+foo i = i == 5
+--
+// module Foo2
+import "Prelude"
+
+foo :: Integer -> Integer -> Boolean
+foo i j = i == j
+--
+import "Prelude"
+import "Foo1"
+import "Foo2"
+
+main = foo 5 && foo 5 4
+--
+false
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading2.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading2.scl
new file mode 100644 (file)
index 0000000..e7a28de
--- /dev/null
@@ -0,0 +1,20 @@
+// module Max1
+import "Prelude"
+
+myMax :: Ord a => a -> a -> a
+myMax = max
+--
+// module Max2
+import "Prelude"
+
+myMax :: Ord a => a -> a -> a -> a
+myMax a b c = max a (max b c)
+--
+import "Prelude"
+import "Max1"
+import "Max2"
+
+main = myMax (1 :: Integer) 2 3 + myMax (3 :: Integer) 2 1 + myMax 4 2 :: Integer
+--
+10
+
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading3.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Overloading3.scl
new file mode 100644 (file)
index 0000000..9385ce7
--- /dev/null
@@ -0,0 +1,23 @@
+// module M1
+import "Prelude"
+
+foo :: Ring a => Boolean -> a -> a
+foo True v = v+1
+foo False v = v+1 
+--
+// module M2
+import "Prelude"
+
+foo :: Ring a => String -> a -> a
+foo cond v = if cond=="true"
+             then v+1
+             else v-1 
+--
+import "Prelude"
+import "M1"
+import "M2"
+
+main = foo False (foo "True" 10) :: Integer
+--
+10
+
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/RecordShorthand.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/RecordShorthand.scl
new file mode 100644 (file)
index 0000000..d3af73e
--- /dev/null
@@ -0,0 +1,11 @@
+import "Prelude"
+
+data Vec = Vec { x :: Double, y :: Double }
+deriving instance Show Vec
+
+createVec x y = Vec {x, y}
+sumVec Vec { x1, y1 } Vec { x2, y2 } = Vec { x = x1+x2, y = y1 + y2 }
+
+main = sumVec (createVec 1 2) (createVec 3 4)
+-- 
+(Vec 4.0 6.0)
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Seq.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/Seq.scl
deleted file mode 100644 (file)
index 4b60e52..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-import "Prelude"\r
-import "JavaBuiltin" as Java\r
-\r
-class Seq seq el where\r
-    myLength :: seq -> Integer\r
-    myGet :: seq -> Integer -> el\r
-\r
-instance (b ~ Character) => Seq String b where\r
-    myLength = Java.method "length"\r
-    myGet = Java.method "charAt"\r
-    \r
-instance (b ~ a) => Seq [a] b where\r
-    myLength = Java.method "size"\r
-    myGet = Java.method "get"\r
-\r
-//main :: (Character, String)\r
-main = (myGet "abc" 1, myGet ["a", "b", "c"] 1)\r
---\r
-(b,b)
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/StringEscape.scl b/bundles/org.simantics.scl.compiler/tests/org/simantics/scl/compiler/tests/scl/StringEscape.scl
new file mode 100644 (file)
index 0000000..51a75d3
--- /dev/null
@@ -0,0 +1,12 @@
+main = "a\nb\"c\'d"\r
+--\r
+a\r
+b"c'd\r
+--\r
+main = "a\u0053"\r
+--\r
+aS\r
+--\r
+main = "a\xb"\r
+--\r
+1:8-1:10: Illegal string escape character.\r
index 891815259e46f059a7c8a0612853f6ee8f9a305b..270d5751b12a559597f6385fea282838840286ee 100644 (file)
@@ -1,4 +1,4 @@
-a = =\r
-b = 4\r
---\r
-1:5-1:6: Unexpected token '=' (EQUALS). Expected one of ATTACHED_HASH, BEGIN_STRING, BLANK, CHAR, DO, ENFORCE, ESCAPED_SYMBOL, FLOAT, ID, IF, INTEGER, LAMBDA, LBRACKET, LET, LPAREN, MATCH, MDO, MINUS, SELECT, SELECT_DISTINCT, SELECT_FIRST, TRANSFORMATION, WHEN.\r
+a = =
+b = 4
+--
+1:5-1:6: Unexpected token '=' (EQUALS). Expected one of ATTACHED_HASH, BEGIN_STRING, BLANK, CHAR, DO, ENFORCE, EQ, ESCAPED_SYMBOL, FLOAT, ID, IF, INTEGER, LAMBDA, LBRACKET, LET, LPAREN, MATCH, MDO, MINUS, SELECT, SELECT_DISTINCT, SELECT_FIRST, TRANSFORMATION, WHEN.
\ No newline at end of file
index 5fbc73cf9d13a70907f2e45c166afd7d2cd840c8..fa3bd9f65988011ca71f8fa7f46fdeec2f7dd4cb 100644 (file)
@@ -1,11 +1,7 @@
 package org.simantics.scl.compiler.tests.unit;\r
 \r
-import gnu.trove.set.hash.THashSet;\r
-\r
 import java.util.Collection;\r
 \r
-import junit.framework.Assert;\r
-\r
 import org.junit.Test;\r
 import org.simantics.scl.compiler.environment.filter.AcceptAllNamespaceFilter;\r
 import org.simantics.scl.compiler.environment.filter.NamespaceFilter;\r
@@ -13,6 +9,9 @@ import org.simantics.scl.compiler.environment.filter.NamespaceFilters;
 import org.simantics.scl.compiler.environment.filter.NegativeNamespaceFilter;\r
 import org.simantics.scl.compiler.environment.filter.PositiveNamespaceFilter;\r
 \r
+import gnu.trove.set.hash.THashSet;\r
+import junit.framework.Assert;\r
+\r
 public class TestNamespaceFilter {\r
     \r
     private void testBooleanOperations(Collection<String> all, NamespaceFilter a, NamespaceFilter b) {\r
index 66431fe50628ac47e7dd8bfcdf6681da31d688cb..975dd57fd843548bc8433c5e19d80feca1bdc9d9 100644 (file)
@@ -105,7 +105,6 @@ public class BundleModuleSource extends EncodedTextualModuleSource {
     }\r
 \r
     public void checkUpdates() {\r
-        System.out.println(url + " checkUpdates");\r
         if(digest != null && listeners != null) {\r
             byte[] newDigest = computeDigest();\r
             if(!Arrays.equals(digest, newDigest)) {\r
@@ -137,7 +136,6 @@ public class BundleModuleSource extends EncodedTextualModuleSource {
     \r
     @Override\r
     public void update(String newSourceText) {\r
-        System.out.println(url + " update");\r
         try {\r
             Path path = getPath();\r
             Files.write(path, newSourceText.getBytes(Charset.forName("UTF-8")));\r
index 2a5d56d7e53f3f24d2130a478374f21a2f7e13ad..c064bd79cad0ecf986a1edc358f3e87a3c6d6c13 100644 (file)
@@ -43,9 +43,6 @@ public class BundleTestScriptRunnable implements TestRunnable {
         try {
             CommandSession session = new CommandSession(SCLOsgi.MODULE_REPOSITORY, handler);
             new TestScriptExecutor(session, reader, handler).execute();
-        } catch(Throwable e) {
-            CommandSession.formatException(handler, e);
-            throw e;
         } finally {
             reader.close();
         }
index ea449d36c200bff82cdc1685fcceab49471c0b72..64d5ac63dbeccba336c6b73cc6fd463e016a9497 100755 (executable)
@@ -6,7 +6,7 @@ Bundle-Version: 0.4.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.simantics.scl.runtime,
  org.simantics.scl.runtime.collection,
- org.simantics.scl.runtime.equations,
+ org.simantics.scl.runtime.exceptions,
  org.simantics.scl.runtime.function,
  org.simantics.scl.runtime.io,
  org.simantics.scl.runtime.lazy,
index 50376a61b6d61c0139f4187eccfab09f95e86078..7149fc63ef9d8d8ddc9256aa9ce4319213a8c924 100755 (executable)
@@ -1,9 +1,5 @@
 package org.simantics.scl.runtime;
 
-import gnu.trove.map.hash.TCustomHashMap;
-import gnu.trove.set.hash.THashSet;
-import gnu.trove.strategy.HashingStrategy;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
@@ -15,6 +11,10 @@ import org.simantics.scl.runtime.function.FunctionImpl1;
 import org.simantics.scl.runtime.function.FunctionImpl2;
 import org.simantics.scl.runtime.tuple.Tuple2;
 
+import gnu.trove.map.hash.TCustomHashMap;
+import gnu.trove.set.hash.THashSet;
+import gnu.trove.strategy.HashingStrategy;
+
 
 @SuppressWarnings({"rawtypes", "unchecked"})
 public class Lists {
index 63fa2f1e28dc6b1240feb08ac2dd57ca233507cf..9b3da5232f49f186d2a718fdd983cdd8b2928473 100644 (file)
@@ -2,8 +2,6 @@ package org.simantics.scl.runtime;
 \r
 import gnu.trove.map.hash.THashMap;\r
 \r
-import java.util.Map;\r
-\r
 public class SCLContext extends THashMap<String,Object> {\r
     private static ThreadLocal<SCLContext> CONTEXT = new ThreadLocal<SCLContext>();\r
     private static ThreadLocal<OldContextNode> OLD_CONTEXT = new ThreadLocal<OldContextNode>();\r
index 8b1c71ef90370fbb9beaac0a8a190b3433192528..856ef28707e0967ede41e68a4bebd0549a0d454f 100644 (file)
@@ -2,7 +2,6 @@ package org.simantics.scl.runtime.equations;
 \r
 import java.util.ArrayList;\r
 import java.util.Collections;\r
-import java.util.Comparator;\r
 import java.util.List;\r
 \r
 import org.simantics.scl.runtime.SCLContext;\r
diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/exceptions/MatchingException.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/exceptions/MatchingException.java
new file mode 100644 (file)
index 0000000..9bca8d8
--- /dev/null
@@ -0,0 +1,13 @@
+package org.simantics.scl.runtime.exceptions;\r
+\r
+public class MatchingException extends RuntimeException {\r
+    private static final long serialVersionUID = -3364111368224089448L;\r
+\r
+    public MatchingException() {\r
+        super();\r
+    }\r
+    \r
+    public MatchingException(String message) {\r
+        super(message);\r
+    }\r
+}\r
index 5b515c26258041cd919eb0bab6381a95b7611545..69cfa77be98cdba4f9d1c246b73b1c10165c8e91 100644 (file)
@@ -1,13 +1,13 @@
 package org.simantics.scl.runtime.io;\r
 \r
-import gnu.trove.list.array.TByteArrayList;\r
-\r
 import java.io.EOFException;\r
 import java.io.IOException;\r
 import java.io.InputStream;\r
 import java.io.OutputStream;\r
 import java.nio.charset.Charset;\r
 \r
+import gnu.trove.list.array.TByteArrayList;\r
+\r
 public class SclIO {\r
 \r
     private static final Charset UTF8 = Charset.forName("UTF-8");\r
index 0a5b99dc6a342a2f5bb721ed44d3a20193150118..4294ee96aeaa5859958ed05df0589515482748cb 100644 (file)
@@ -1,12 +1,5 @@
 package org.simantics.scl.runtime.minigraph;
 
-import gnu.trove.impl.Constants;
-import gnu.trove.map.hash.TIntObjectHashMap;
-import gnu.trove.map.hash.TLongObjectHashMap;
-import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.procedure.TIntProcedure;
-import gnu.trove.set.hash.TIntHashSet;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -15,6 +8,13 @@ import org.simantics.scl.runtime.SCLContext;
 import org.simantics.scl.runtime.function.Function;
 import org.simantics.scl.runtime.tuple.Tuple0;
 
+import gnu.trove.impl.Constants;
+import gnu.trove.map.hash.TIntObjectHashMap;
+import gnu.trove.map.hash.TLongObjectHashMap;
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.procedure.TIntProcedure;
+import gnu.trove.set.hash.TIntHashSet;
+
 public class Minigraph {
 
     private static final int[] EMPTY_INT_ARRAY = new int[0];
index 8bc899370bf341b59bf099b77683e4794174f939..4b465732344c617c470ff273c67c112c11be842a 100644 (file)
@@ -1,12 +1,12 @@
 package org.simantics.scl.runtime.unification;
 
-import gnu.trove.map.hash.THashMap;
-
 import java.util.Map;
 
 import org.simantics.scl.runtime.function.Function;
 import org.simantics.scl.runtime.tuple.Tuple0;
 
+import gnu.trove.map.hash.THashMap;
+
 public class UMapUtils {
     public static void put(Map<Object,Object> map, Object key, Object value) {
         if(map.containsKey(key))
index a9e498d9eb96d2371ceaacc5b7c0c216deb15e8d..16de671737f827c6197ee7b1ec906957b49185e7 100644 (file)
                        <arguments>
                        </arguments>
                </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.m2e.core.maven2Builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
        </buildSpec>
        <natures>
-               <nature>org.eclipse.m2e.core.maven2Nature</nature>
                <nature>org.eclipse.pde.PluginNature</nature>
                <nature>org.eclipse.jdt.core.javanature</nature>
        </natures>