├── .gitattributes
├── .github
└── workflows
│ └── maven.yml
├── .gitignore
├── .gitmodules
├── .idea
├── .gitignore
├── LanguageServersSettings.xml
├── artifacts
│ └── mindcode_compiler_jar.xml
├── codeStyles
│ └── codeStyleConfig.xml
├── compiler.xml
├── encodings.xml
├── inspectionProfiles
│ ├── Markdown.xml
│ ├── Nullness.xml
│ ├── Pre_commit.xml
│ ├── Project_Default.xml
│ └── profiles_settings.xml
├── jarRepositories.xml
├── misc.xml
├── modules.xml
└── uiDesigner.xml
├── .mvn
└── wrapper
│ ├── MavenWrapperDownloader.java
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── CHANGELOG.markdown
├── CONTRIBUTING.markdown
├── Dockerfile
├── IDEAS.markdown
├── LICENSE
├── Procfile
├── README.markdown
├── SYNTAX.markdown
├── annotations
├── pom.xml
└── src
│ └── main
│ └── java
│ └── info
│ └── teksol
│ └── annotations
│ ├── AstNode.java
│ ├── BaseClass.java
│ └── processor
│ └── AstNodeAnnotationProcessor.java
├── bin
├── build
├── dbconsole
├── deploy
├── mindcode
├── mindcode.bat
├── run-local
├── run-local.ps1
└── webapp.bat
├── compiler
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── info
│ │ │ └── teksol
│ │ │ └── mc
│ │ │ ├── Version.java
│ │ │ ├── common
│ │ │ ├── CompilerOutput.java
│ │ │ ├── InputFile.java
│ │ │ ├── InputFiles.java
│ │ │ ├── PositionFormatter.java
│ │ │ ├── SourceElement.java
│ │ │ ├── SourcePosition.java
│ │ │ └── TextFilePosition.java
│ │ │ ├── emulator
│ │ │ ├── AbstractMindustryObject.java
│ │ │ ├── MindustryObject.java
│ │ │ ├── MindustryString.java
│ │ │ ├── MindustryVariable.java
│ │ │ ├── blocks
│ │ │ │ ├── Memory.java
│ │ │ │ ├── MessageBlock.java
│ │ │ │ ├── MindustryBlock.java
│ │ │ │ └── graphics
│ │ │ │ │ ├── GraphicsBuffer.java
│ │ │ │ │ ├── LogicDisplay.java
│ │ │ │ │ └── TransformationMatrix.java
│ │ │ └── processor
│ │ │ │ ├── Assertion.java
│ │ │ │ ├── ExecutionException.java
│ │ │ │ ├── ExecutionFlag.java
│ │ │ │ ├── MindustryVariables.java
│ │ │ │ ├── Processor.java
│ │ │ │ └── TextBuffer.java
│ │ │ ├── evaluator
│ │ │ ├── Color.java
│ │ │ ├── ConditionEvaluator.java
│ │ │ ├── ExpressionEvaluator.java
│ │ │ ├── ExpressionValue.java
│ │ │ ├── LogicCondition.java
│ │ │ ├── LogicOperation.java
│ │ │ ├── LogicReadable.java
│ │ │ └── LogicWritable.java
│ │ │ ├── messages
│ │ │ ├── AbstractMessageEmitter.java
│ │ │ ├── AbstractMessageLogger.java
│ │ │ ├── CompilerMessage.java
│ │ │ ├── ERR.java
│ │ │ ├── ExpectedMessages.java
│ │ │ ├── ListMessageLogger.java
│ │ │ ├── MessageConsumer.java
│ │ │ ├── MessageEmitter.java
│ │ │ ├── MessageLevel.java
│ │ │ ├── MessageLogger.java
│ │ │ ├── MindcodeMessage.java
│ │ │ ├── SourcePositionTranslator.java
│ │ │ ├── TimingMessage.java
│ │ │ ├── ToolMessage.java
│ │ │ ├── TranslatingMessageConsumer.java
│ │ │ └── WARN.java
│ │ │ ├── mindcode
│ │ │ ├── compiler
│ │ │ │ ├── CallType.java
│ │ │ │ ├── CompilationPhase.java
│ │ │ │ ├── CompilerContext.java
│ │ │ │ ├── DataType.java
│ │ │ │ ├── InstructionCounter.java
│ │ │ │ ├── MindcodeCompiler.java
│ │ │ │ ├── MindcodeErrorListener.java
│ │ │ │ ├── MindcodeErrorStrategy.java
│ │ │ │ ├── MindcodeInternalError.java
│ │ │ │ ├── Modifier.java
│ │ │ │ ├── RequirementsProcessor.java
│ │ │ │ ├── antlr
│ │ │ │ │ ├── LexerParser.java
│ │ │ │ │ ├── MindcodeLexer.g4
│ │ │ │ │ ├── MindcodeLexer.interp
│ │ │ │ │ ├── MindcodeLexer.java
│ │ │ │ │ ├── MindcodeLexer.tokens
│ │ │ │ │ ├── MindcodeParser.g4
│ │ │ │ │ ├── MindcodeParser.interp
│ │ │ │ │ ├── MindcodeParser.java
│ │ │ │ │ ├── MindcodeParser.tokens
│ │ │ │ │ ├── MindcodeParserBaseListener.java
│ │ │ │ │ ├── MindcodeParserBaseVisitor.java
│ │ │ │ │ ├── MindcodeParserListener.java
│ │ │ │ │ ├── MindcodeParserVisitor.java
│ │ │ │ │ └── MissingSemicolonException.java
│ │ │ │ ├── ast
│ │ │ │ │ ├── AbstractAstIndentedPrinter.java
│ │ │ │ │ ├── AstBuilder.java
│ │ │ │ │ ├── AstBuilderContext.java
│ │ │ │ │ ├── ParserAbort.java
│ │ │ │ │ └── nodes
│ │ │ │ │ │ ├── AstAllocation.java
│ │ │ │ │ │ ├── AstAllocations.java
│ │ │ │ │ │ ├── AstArray.java
│ │ │ │ │ │ ├── AstArrayAccess.java
│ │ │ │ │ │ ├── AstAssignment.java
│ │ │ │ │ │ ├── AstBaseMindcodeNode.java
│ │ │ │ │ │ ├── AstBreakStatement.java
│ │ │ │ │ │ ├── AstBuiltInIdentifier.java
│ │ │ │ │ │ ├── AstCaseAlternative.java
│ │ │ │ │ │ ├── AstCaseExpression.java
│ │ │ │ │ │ ├── AstCodeBlock.java
│ │ │ │ │ │ ├── AstContinueStatement.java
│ │ │ │ │ │ ├── AstDeclaration.java
│ │ │ │ │ │ ├── AstDirectiveDeclare.java
│ │ │ │ │ │ ├── AstDirectiveSet.java
│ │ │ │ │ │ ├── AstDirectiveValue.java
│ │ │ │ │ │ ├── AstDocComment.java
│ │ │ │ │ │ ├── AstEnhancedComment.java
│ │ │ │ │ │ ├── AstExpression.java
│ │ │ │ │ │ ├── AstExpressionList.java
│ │ │ │ │ │ ├── AstExternalParameters.java
│ │ │ │ │ │ ├── AstForEachLoopStatement.java
│ │ │ │ │ │ ├── AstFormattableLiteral.java
│ │ │ │ │ │ ├── AstFormattablePlaceholder.java
│ │ │ │ │ │ ├── AstFragment.java
│ │ │ │ │ │ ├── AstFunctionArgument.java
│ │ │ │ │ │ ├── AstFunctionCall.java
│ │ │ │ │ │ ├── AstFunctionDeclaration.java
│ │ │ │ │ │ ├── AstFunctionParameter.java
│ │ │ │ │ │ ├── AstIdentifier.java
│ │ │ │ │ │ ├── AstIfBranch.java
│ │ │ │ │ │ ├── AstIfExpression.java
│ │ │ │ │ │ ├── AstIteratedForLoopStatement.java
│ │ │ │ │ │ ├── AstIterator.java
│ │ │ │ │ │ ├── AstIteratorsValuesGroup.java
│ │ │ │ │ │ ├── AstKeyword.java
│ │ │ │ │ │ ├── AstLabeledStatement.java
│ │ │ │ │ │ ├── AstLiteral.java
│ │ │ │ │ │ ├── AstLiteralBinary.java
│ │ │ │ │ │ ├── AstLiteralBoolean.java
│ │ │ │ │ │ ├── AstLiteralChar.java
│ │ │ │ │ │ ├── AstLiteralColor.java
│ │ │ │ │ │ ├── AstLiteralDecimal.java
│ │ │ │ │ │ ├── AstLiteralEscape.java
│ │ │ │ │ │ ├── AstLiteralFloat.java
│ │ │ │ │ │ ├── AstLiteralHexadecimal.java
│ │ │ │ │ │ ├── AstLiteralNamedColor.java
│ │ │ │ │ │ ├── AstLiteralNull.java
│ │ │ │ │ │ ├── AstLiteralNumeric.java
│ │ │ │ │ │ ├── AstLiteralString.java
│ │ │ │ │ │ ├── AstMemberAccess.java
│ │ │ │ │ │ ├── AstMindcodeNode.java
│ │ │ │ │ │ ├── AstMlogBlock.java
│ │ │ │ │ │ ├── AstMlogComment.java
│ │ │ │ │ │ ├── AstMlogInstruction.java
│ │ │ │ │ │ ├── AstMlogParameters.java
│ │ │ │ │ │ ├── AstMlogStatement.java
│ │ │ │ │ │ ├── AstMlogToken.java
│ │ │ │ │ │ ├── AstMlogVariable.java
│ │ │ │ │ │ ├── AstModule.java
│ │ │ │ │ │ ├── AstModuleDeclaration.java
│ │ │ │ │ │ ├── AstNodeScope.java
│ │ │ │ │ │ ├── AstOperatorBinary.java
│ │ │ │ │ │ ├── AstOperatorIncDec.java
│ │ │ │ │ │ ├── AstOperatorTernary.java
│ │ │ │ │ │ ├── AstOperatorUnary.java
│ │ │ │ │ │ ├── AstParameter.java
│ │ │ │ │ │ ├── AstParentheses.java
│ │ │ │ │ │ ├── AstProgram.java
│ │ │ │ │ │ ├── AstPropertyAccess.java
│ │ │ │ │ │ ├── AstQualifiedIdentifier.java
│ │ │ │ │ │ ├── AstRange.java
│ │ │ │ │ │ ├── AstRangedForLoopStatement.java
│ │ │ │ │ │ ├── AstRemoteParameters.java
│ │ │ │ │ │ ├── AstRequire.java
│ │ │ │ │ │ ├── AstRequireFile.java
│ │ │ │ │ │ ├── AstRequireLibrary.java
│ │ │ │ │ │ ├── AstReturnStatement.java
│ │ │ │ │ │ ├── AstStatement.java
│ │ │ │ │ │ ├── AstStatementList.java
│ │ │ │ │ │ ├── AstSubarray.java
│ │ │ │ │ │ ├── AstVariableModifier.java
│ │ │ │ │ │ ├── AstVariableSpecification.java
│ │ │ │ │ │ ├── AstVariablesDeclaration.java
│ │ │ │ │ │ ├── AstWhileLoopStatement.java
│ │ │ │ │ │ └── ExternalStorage.java
│ │ │ │ ├── astcontext
│ │ │ │ │ ├── AstContext.java
│ │ │ │ │ ├── AstContextType.java
│ │ │ │ │ └── AstSubcontextType.java
│ │ │ │ ├── callgraph
│ │ │ │ │ ├── CallGraph.java
│ │ │ │ │ ├── CallGraphCreator.java
│ │ │ │ │ ├── CallGraphCreatorContext.java
│ │ │ │ │ ├── FunctionDefinitions.java
│ │ │ │ │ └── MindcodeFunction.java
│ │ │ │ ├── evaluator
│ │ │ │ │ ├── CompileTimeEvaluator.java
│ │ │ │ │ ├── CompileTimeEvaluatorContext.java
│ │ │ │ │ ├── ExpressionValue.java
│ │ │ │ │ ├── IntermediateValue.java
│ │ │ │ │ ├── Result.java
│ │ │ │ │ └── ValueType.java
│ │ │ │ ├── functions
│ │ │ │ │ ├── AbstractHandler.java
│ │ │ │ │ ├── BaseFunctionMapper.java
│ │ │ │ │ ├── DeprecatedPropertyHandler.java
│ │ │ │ │ ├── FunctionHandler.java
│ │ │ │ │ ├── FunctionMapper.java
│ │ │ │ │ ├── FunctionMapperContext.java
│ │ │ │ │ ├── InvalidMetadataException.java
│ │ │ │ │ ├── MessageFunctionHandler.java
│ │ │ │ │ ├── MultiplexedFunctionHandler.java
│ │ │ │ │ ├── PropertyHandler.java
│ │ │ │ │ ├── SampleGenerator.java
│ │ │ │ │ ├── SelectorFunction.java
│ │ │ │ │ ├── StandardFunctionHandler.java
│ │ │ │ │ ├── StandardPropertyHandler.java
│ │ │ │ │ ├── UbindFunctionHandler.java
│ │ │ │ │ └── VariableArityFunctionHandler.java
│ │ │ │ ├── generation
│ │ │ │ │ ├── AbstractBuilder.java
│ │ │ │ │ ├── AbstractStandaloneBuilder.java
│ │ │ │ │ ├── CodeAssembler.java
│ │ │ │ │ ├── CodeAssemblerContext.java
│ │ │ │ │ ├── CodeGenerator.java
│ │ │ │ │ ├── CodeGeneratorContext.java
│ │ │ │ │ ├── LoopStack.java
│ │ │ │ │ ├── ReturnStack.java
│ │ │ │ │ ├── StackTracker.java
│ │ │ │ │ ├── builders
│ │ │ │ │ │ ├── AbstractFunctionBuilder.java
│ │ │ │ │ │ ├── AbstractLoopBuilder.java
│ │ │ │ │ │ ├── AssignmentsBuilder.java
│ │ │ │ │ │ ├── BreakContinueStatementsBuilder.java
│ │ │ │ │ │ ├── BuiltinFunctionAssertsBuilder.java
│ │ │ │ │ │ ├── BuiltinFunctionMlogBuilder.java
│ │ │ │ │ │ ├── BuiltinFunctionTextOutputBuilder.java
│ │ │ │ │ │ ├── BuiltinFunctionVarargsBuilder.java
│ │ │ │ │ │ ├── CaseExpressionsBuilder.java
│ │ │ │ │ │ ├── DeclarationsBuilder.java
│ │ │ │ │ │ ├── ForEachLoopStatementsBuilder.java
│ │ │ │ │ │ ├── FunctionCallsBuilder.java
│ │ │ │ │ │ ├── FunctionDeclarationsBuilder.java
│ │ │ │ │ │ ├── IdentifiersBuilder.java
│ │ │ │ │ │ ├── IfExpressionsBuilder.java
│ │ │ │ │ │ ├── IteratedForLoopStatementsBuilder.java
│ │ │ │ │ │ ├── LiteralsBuilder.java
│ │ │ │ │ │ ├── MemberAccessBuilder.java
│ │ │ │ │ │ ├── MlogBlocksBuilder.java
│ │ │ │ │ │ ├── OperatorsBuilder.java
│ │ │ │ │ │ ├── RangedForLoopStatementsBuilder.java
│ │ │ │ │ │ ├── StandardFunctionCallsBuilder.java
│ │ │ │ │ │ ├── StatementListsBuilder.java
│ │ │ │ │ │ └── WhileLoopStatementsBuilder.java
│ │ │ │ │ └── variables
│ │ │ │ │ │ ├── AbstractArrayStore.java
│ │ │ │ │ │ ├── ArrayStore.java
│ │ │ │ │ │ ├── CompoundValueStore.java
│ │ │ │ │ │ ├── ExternalArray.java
│ │ │ │ │ │ ├── ExternalCachedVariable.java
│ │ │ │ │ │ ├── ExternalVariable.java
│ │ │ │ │ │ ├── FormattableContent.java
│ │ │ │ │ │ ├── FunctionArgument.java
│ │ │ │ │ │ ├── FunctionContext.java
│ │ │ │ │ │ ├── FunctionParameter.java
│ │ │ │ │ │ ├── GlobalContext.java
│ │ │ │ │ │ ├── HeapTracker.java
│ │ │ │ │ │ ├── IdentifierFunctionArgument.java
│ │ │ │ │ │ ├── InputFunctionArgument.java
│ │ │ │ │ │ ├── InternalArray.java
│ │ │ │ │ │ ├── LocalContext.java
│ │ │ │ │ │ ├── MissingFunctionArgument.java
│ │ │ │ │ │ ├── MissingValue.java
│ │ │ │ │ │ ├── NameCreator.java
│ │ │ │ │ │ ├── OptimizerContext.java
│ │ │ │ │ │ ├── OutputFunctionArgument.java
│ │ │ │ │ │ ├── ProcessorStorage.java
│ │ │ │ │ │ ├── Property.java
│ │ │ │ │ │ ├── RecursiveContext.java
│ │ │ │ │ │ ├── RemoteVariable.java
│ │ │ │ │ │ ├── StandardNameCreator.java
│ │ │ │ │ │ ├── StructuredValueStore.java
│ │ │ │ │ │ ├── ValueStore.java
│ │ │ │ │ │ ├── VariableScope.java
│ │ │ │ │ │ ├── Variables.java
│ │ │ │ │ │ └── VariablesContext.java
│ │ │ │ ├── optimization
│ │ │ │ │ ├── AbstractOptimizer.java
│ │ │ │ │ ├── ArrayOptimizer.java
│ │ │ │ │ ├── BaseOptimizer.java
│ │ │ │ │ ├── CaseExpressionOptimizer.java
│ │ │ │ │ ├── CaseSwitcher.java
│ │ │ │ │ ├── DataFlowOptimizer.java
│ │ │ │ │ ├── DataFlowVariableStates.java
│ │ │ │ │ ├── DeadCodeEliminator.java
│ │ │ │ │ ├── DebugPrinter.java
│ │ │ │ │ ├── DiffDebugPrinter.java
│ │ │ │ │ ├── ExpressionOptimizer.java
│ │ │ │ │ ├── FunctionInliner.java
│ │ │ │ │ ├── IfExpressionOptimizer.java
│ │ │ │ │ ├── JumpNormalizer.java
│ │ │ │ │ ├── JumpOptimizer.java
│ │ │ │ │ ├── JumpStraightening.java
│ │ │ │ │ ├── JumpThreading.java
│ │ │ │ │ ├── LoopHoisting.java
│ │ │ │ │ ├── LoopOptimizer.java
│ │ │ │ │ ├── LoopUnroller.java
│ │ │ │ │ ├── NullDebugPrinter.java
│ │ │ │ │ ├── Optimization.java
│ │ │ │ │ ├── OptimizationAction.java
│ │ │ │ │ ├── OptimizationContext.java
│ │ │ │ │ ├── OptimizationCoordinator.java
│ │ │ │ │ ├── OptimizationLevel.java
│ │ │ │ │ ├── OptimizationPhase.java
│ │ │ │ │ ├── OptimizationResult.java
│ │ │ │ │ ├── Optimizer.java
│ │ │ │ │ ├── OptimizerExpressionEvaluator.java
│ │ │ │ │ ├── OptimizerMessage.java
│ │ │ │ │ ├── PrintMerger.java
│ │ │ │ │ ├── ReturnOptimizer.java
│ │ │ │ │ ├── SingleStepEliminator.java
│ │ │ │ │ ├── StackOptimizer.java
│ │ │ │ │ ├── TempVariableEliminator.java
│ │ │ │ │ ├── UnreachableCodeEliminator.java
│ │ │ │ │ └── cases
│ │ │ │ │ │ ├── AbstractSegmentConfigurationGenerator.java
│ │ │ │ │ │ ├── CaseSwitcherConfigurations.java
│ │ │ │ │ │ ├── CombinatorialSegmentConfigurationGenerator.java
│ │ │ │ │ │ ├── Partition.java
│ │ │ │ │ │ ├── Segment.java
│ │ │ │ │ │ ├── SegmentConfiguration.java
│ │ │ │ │ │ ├── SegmentConfigurationGenerator.java
│ │ │ │ │ │ ├── SegmentType.java
│ │ │ │ │ │ └── Targets.java
│ │ │ │ ├── postprocess
│ │ │ │ │ ├── LogicInstructionArrayExpander.java
│ │ │ │ │ ├── LogicInstructionLabelResolver.java
│ │ │ │ │ └── LogicInstructionPrinter.java
│ │ │ │ └── preprocess
│ │ │ │ │ ├── DirectivePreprocessor.java
│ │ │ │ │ └── PreprocessorContext.java
│ │ │ ├── decompiler
│ │ │ │ ├── InstructionExpression.java
│ │ │ │ ├── MlogDecompiler.java
│ │ │ │ ├── MlogExpression.java
│ │ │ │ ├── MlogParser.java
│ │ │ │ ├── MlogVariable.java
│ │ │ │ ├── OperationExpression.java
│ │ │ │ └── ParsedMlog.java
│ │ │ └── logic
│ │ │ │ ├── arguments
│ │ │ │ ├── AbstractArgument.java
│ │ │ │ ├── ArgumentType.java
│ │ │ │ ├── AssertOp.java
│ │ │ │ ├── AssertionType.java
│ │ │ │ ├── Condition.java
│ │ │ │ ├── GenericArgument.java
│ │ │ │ ├── LogicAddress.java
│ │ │ │ ├── LogicArgument.java
│ │ │ │ ├── LogicArray.java
│ │ │ │ ├── LogicBoolean.java
│ │ │ │ ├── LogicBuiltIn.java
│ │ │ │ ├── LogicBuiltinConst.java
│ │ │ │ ├── LogicColor.java
│ │ │ │ ├── LogicKeyword.java
│ │ │ │ ├── LogicLabel.java
│ │ │ │ ├── LogicLiteral.java
│ │ │ │ ├── LogicNamedColor.java
│ │ │ │ ├── LogicNull.java
│ │ │ │ ├── LogicNumber.java
│ │ │ │ ├── LogicParameter.java
│ │ │ │ ├── LogicString.java
│ │ │ │ ├── LogicToken.java
│ │ │ │ ├── LogicValue.java
│ │ │ │ ├── LogicVariable.java
│ │ │ │ ├── LogicVoid.java
│ │ │ │ ├── Operation.java
│ │ │ │ ├── ValueMutability.java
│ │ │ │ └── arrays
│ │ │ │ │ ├── AbstractArrayConstructor.java
│ │ │ │ │ ├── ArrayConstructor.java
│ │ │ │ │ ├── ArraySize1Constructor.java
│ │ │ │ │ ├── ArraySize2Or3Constructor.java
│ │ │ │ │ ├── ExternalArrayConstructor.java
│ │ │ │ │ ├── InlinedArrayConstructor.java
│ │ │ │ │ └── RegularArrayConstructor.java
│ │ │ │ ├── instructions
│ │ │ │ ├── AbstractInstruction.java
│ │ │ │ ├── ArrayAccessInstruction.java
│ │ │ │ ├── ArrayOrganization.java
│ │ │ │ ├── BaseInstruction.java
│ │ │ │ ├── BaseInstructionProcessor.java
│ │ │ │ ├── BaseResultInstruction.java
│ │ │ │ ├── CallInstruction.java
│ │ │ │ ├── CallRecInstruction.java
│ │ │ │ ├── CallingInstruction.java
│ │ │ │ ├── CommentInstruction.java
│ │ │ │ ├── ConditionalInstruction.java
│ │ │ │ ├── ContextfulInstructionCreator.java
│ │ │ │ ├── ContextlessInstructionCreator.java
│ │ │ │ ├── ControlInstruction.java
│ │ │ │ ├── CustomInstruction.java
│ │ │ │ ├── DrawInstruction.java
│ │ │ │ ├── DrawflushInstruction.java
│ │ │ │ ├── EmptyInstruction.java
│ │ │ │ ├── EndInstruction.java
│ │ │ │ ├── FormatInstruction.java
│ │ │ │ ├── GetlinkInstruction.java
│ │ │ │ ├── InstructionComment.java
│ │ │ │ ├── InstructionInfo.java
│ │ │ │ ├── InstructionProcessor.java
│ │ │ │ ├── InstructionProcessorFactory.java
│ │ │ │ ├── JumpInstruction.java
│ │ │ │ ├── LabelInstruction.java
│ │ │ │ ├── LabeledInstruction.java
│ │ │ │ ├── LocalContextfulInstructionsCreator.java
│ │ │ │ ├── LogicInstruction.java
│ │ │ │ ├── LogicResultInstruction.java
│ │ │ │ ├── LookupInstruction.java
│ │ │ │ ├── MindustryInstructionProcessor7.java
│ │ │ │ ├── MindustryInstructionProcessor8.java
│ │ │ │ ├── MlogInstruction.java
│ │ │ │ ├── MultiCallInstruction.java
│ │ │ │ ├── MultiJumpInstruction.java
│ │ │ │ ├── MultiLabelInstruction.java
│ │ │ │ ├── MultiTargetInstruction.java
│ │ │ │ ├── OpInstruction.java
│ │ │ │ ├── PackColorInstruction.java
│ │ │ │ ├── PopInstruction.java
│ │ │ │ ├── PrintCharInstruction.java
│ │ │ │ ├── PrintInstruction.java
│ │ │ │ ├── PrintflushInstruction.java
│ │ │ │ ├── PrintingInstruction.java
│ │ │ │ ├── PushInstruction.java
│ │ │ │ ├── PushOrPopInstruction.java
│ │ │ │ ├── ReadArrInstruction.java
│ │ │ │ ├── ReadInstruction.java
│ │ │ │ ├── RemarkInstruction.java
│ │ │ │ ├── ReturnInstruction.java
│ │ │ │ ├── ReturnRecInstruction.java
│ │ │ │ ├── SelectInstruction.java
│ │ │ │ ├── SensorInstruction.java
│ │ │ │ ├── SetAddressInstruction.java
│ │ │ │ ├── SetInstruction.java
│ │ │ │ ├── SideEffects.java
│ │ │ │ ├── StopInstruction.java
│ │ │ │ ├── UnpackColorInstruction.java
│ │ │ │ ├── WriteArrInstruction.java
│ │ │ │ └── WriteInstruction.java
│ │ │ │ ├── mimex
│ │ │ │ ├── BlockType.java
│ │ │ │ ├── ContentType.java
│ │ │ │ ├── Icons.java
│ │ │ │ ├── Item.java
│ │ │ │ ├── LAccess.java
│ │ │ │ ├── LVar.java
│ │ │ │ ├── Liquid.java
│ │ │ │ ├── MindustryContent.java
│ │ │ │ ├── MindustryMetadata.java
│ │ │ │ ├── NamedColor.java
│ │ │ │ ├── NamedContent.java
│ │ │ │ ├── Unit.java
│ │ │ │ ├── UnitCommand.java
│ │ │ │ ├── UnknownContent.java
│ │ │ │ └── Weather.java
│ │ │ │ └── opcodes
│ │ │ │ ├── FunctionMapping.java
│ │ │ │ ├── InstructionParameterType.java
│ │ │ │ ├── KeywordCategory.java
│ │ │ │ ├── MindustryOpcodeVariants.java
│ │ │ │ ├── NamedParameter.java
│ │ │ │ ├── Opcode.java
│ │ │ │ ├── OpcodeVariant.java
│ │ │ │ ├── ProcessorEdition.java
│ │ │ │ ├── ProcessorVersion.java
│ │ │ │ └── TypedArgument.java
│ │ │ ├── profile
│ │ │ ├── BuiltinEvaluation.java
│ │ │ ├── CompilerProfile.java
│ │ │ ├── DirectiveProcessor.java
│ │ │ ├── FileReferences.java
│ │ │ ├── FinalCodeOutput.java
│ │ │ ├── GenerationGoal.java
│ │ │ ├── GlobalCompilerProfile.java
│ │ │ ├── LocalCompilerProfile.java
│ │ │ ├── Remarks.java
│ │ │ ├── RuntimeChecks.java
│ │ │ ├── SortCategory.java
│ │ │ ├── SyntacticMode.java
│ │ │ └── options
│ │ │ │ ├── BooleanCompilerOptionValue.java
│ │ │ │ ├── CompilerOption.java
│ │ │ │ ├── CompilerOptionFactory.java
│ │ │ │ ├── CompilerOptionValue.java
│ │ │ │ ├── CompilerOptions.java
│ │ │ │ ├── DebuggingOptions.java
│ │ │ │ ├── DoubleCompilerOptionValue.java
│ │ │ │ ├── EnumCompilerOptionValue.java
│ │ │ │ ├── EnvironmentOptions.java
│ │ │ │ ├── InputOutputOptions.java
│ │ │ │ ├── IntOptimizationLevelCompilerValue.java
│ │ │ │ ├── IntegerCompilerOptionValue.java
│ │ │ │ ├── MlogFormatOptions.java
│ │ │ │ ├── OptimizationLevelCompilerValue.java
│ │ │ │ ├── OptimizationOptionValue.java
│ │ │ │ ├── OptimizationOptions.java
│ │ │ │ ├── OptionAvailability.java
│ │ │ │ ├── OptionCategory.java
│ │ │ │ ├── OptionMultiplicity.java
│ │ │ │ ├── OptionScope.java
│ │ │ │ ├── RunOptions.java
│ │ │ │ ├── SchematicOptions.java
│ │ │ │ ├── SemanticStability.java
│ │ │ │ ├── StringCompilerOptionValue.java
│ │ │ │ ├── Target.java
│ │ │ │ └── TargetCompilerOptionValue.java
│ │ │ └── util
│ │ │ ├── CRC64.java
│ │ │ ├── CollectionUtils.java
│ │ │ ├── EnumUtils.java
│ │ │ ├── Indenter.java
│ │ │ ├── IntRange.java
│ │ │ ├── Lazy.java
│ │ │ ├── ObjectUtils.java
│ │ │ ├── StringSimilarity.java
│ │ │ ├── StringUtils.java
│ │ │ ├── TraceFile.java
│ │ │ ├── Tuple2.java
│ │ │ └── Tuple2Nullable.java
│ ├── resources-filtered
│ │ └── info
│ │ │ └── teksol
│ │ │ └── mc
│ │ │ └── mindcode.properties
│ └── resources
│ │ ├── META-INF
│ │ └── services
│ │ │ └── javax.annotation.processing.Processor
│ │ └── library
│ │ ├── arrays.mnd
│ │ ├── blocks.mnd
│ │ ├── compatibility.mnd
│ │ ├── graphics.mnd
│ │ ├── math.mnd
│ │ ├── printing.mnd
│ │ └── units.mnd
│ └── test
│ ├── java
│ └── info
│ │ └── teksol
│ │ └── mc
│ │ ├── VersionTest.java
│ │ ├── mindcode
│ │ ├── CompatibilityLibraryGeneratorTest.java
│ │ ├── DocGeneratorTest.java
│ │ ├── DocValidatorTest.java
│ │ ├── SystemLibraryTest.java
│ │ ├── compiler
│ │ │ ├── AbstractTestBase.java
│ │ │ ├── MindcodeCompilerTest.java
│ │ │ ├── antlr
│ │ │ │ ├── AbstractParserTest.java
│ │ │ │ └── MindcodeParserTest.java
│ │ │ ├── ast
│ │ │ │ ├── AbstractAstBuilderTest.java
│ │ │ │ ├── AstBuilderTest.java
│ │ │ │ └── AstIndentedPrinterTest.java
│ │ │ ├── astcontext
│ │ │ │ └── AstContextTest.java
│ │ │ ├── callgraph
│ │ │ │ └── CallGraphCreatorTest.java
│ │ │ ├── evaluator
│ │ │ │ └── CompileTimeEvaluatorTest.java
│ │ │ ├── functions
│ │ │ │ ├── AbstractFunctionMapperTest.java
│ │ │ │ ├── BaseFunctionMapperTest.java
│ │ │ │ ├── FunctionReferenceGeneratorTest.java
│ │ │ │ ├── InstructionSamplesTest.java
│ │ │ │ └── StandardFunctionHandlerTest.java
│ │ │ ├── generation
│ │ │ │ ├── AbstractCodeGeneratorTest.java
│ │ │ │ ├── CodeGeneratorTest.java
│ │ │ │ ├── LoopStackTest.java
│ │ │ │ ├── RemoteModulesTest.java
│ │ │ │ ├── ReturnStackTest.java
│ │ │ │ └── builders
│ │ │ │ │ ├── AssignmentsBuilderTest.java
│ │ │ │ │ ├── BreakContinueStatementsBuilderTest.java
│ │ │ │ │ ├── BuiltinFunctionAssertsBuilderTest.java
│ │ │ │ │ ├── BuiltinFunctionMlogBuilderTest.java
│ │ │ │ │ ├── BuiltinFunctionTextOutputBuilderTest.java
│ │ │ │ │ ├── BuiltinFunctionVarargsBuilderTest.java
│ │ │ │ │ ├── CaseExpressionsBuilderTest.java
│ │ │ │ │ ├── DeclarationsBuilderTest.java
│ │ │ │ │ ├── ForEachLoopStatementsBuilderTest.java
│ │ │ │ │ ├── FunctionDeclarationsBuilderTest.java
│ │ │ │ │ ├── IdentifiersBuilderTest.java
│ │ │ │ │ ├── IfExpressionsBuilderTest.java
│ │ │ │ │ ├── IteratedForLoopStatementsBuilderTest.java
│ │ │ │ │ ├── LiteralsBuilderTest.java
│ │ │ │ │ ├── MemberAccessBuilderTest.java
│ │ │ │ │ ├── MlogBlocksBuilderTest.java
│ │ │ │ │ ├── OperatorsBuilderTest.java
│ │ │ │ │ ├── RangedForLoopStatementsBuilderTest.java
│ │ │ │ │ ├── StandardFunctionCallsBuilderTest.java
│ │ │ │ │ └── WhileLoopStatementsBuilderTest.java
│ │ │ ├── optimization
│ │ │ │ ├── AbstractOptimizerTest.java
│ │ │ │ ├── ArrayOptimizerTest.java
│ │ │ │ ├── BaseOptimizerTest.java
│ │ │ │ ├── CaseExpressionOptimizerTest.java
│ │ │ │ ├── CaseSwitcherConfigurationGeneratorTest.java
│ │ │ │ ├── CaseSwitcherTest.java
│ │ │ │ ├── DataFlowOptimizerTest.java
│ │ │ │ ├── DeadCodeEliminatorTest.java
│ │ │ │ ├── DiffDebugPrinterTest.java
│ │ │ │ ├── ExpressionOptimizerTest.java
│ │ │ │ ├── FunctionInlinerTest.java
│ │ │ │ ├── GeneralOptimizationTest.java
│ │ │ │ ├── IfExpressionOptimizerTest.java
│ │ │ │ ├── JumpNormalizerTest.java
│ │ │ │ ├── JumpOptimizerTest.java
│ │ │ │ ├── JumpStraighteningTest.java
│ │ │ │ ├── JumpThreadingTest.java
│ │ │ │ ├── LoopHoistingTest.java
│ │ │ │ ├── LoopOptimizerTest.java
│ │ │ │ ├── LoopUnrollerBasicTest.java
│ │ │ │ ├── LoopUnrollerFullTest.java
│ │ │ │ ├── LoopUnrollerTestBase.java
│ │ │ │ ├── OptimizationCoordinatorTest.java
│ │ │ │ ├── PrintMergerLogic7Test.java
│ │ │ │ ├── PrintMergerTest.java
│ │ │ │ ├── ReturnOptimizerTest.java
│ │ │ │ ├── SingleStepEliminatorTest.java
│ │ │ │ ├── StackOptimizerTest.java
│ │ │ │ ├── TempVariableEliminatorTest.java
│ │ │ │ └── UnreachableCodeEliminatorTest.java
│ │ │ ├── postprocess
│ │ │ │ ├── AbstractCodeOutputTest.java
│ │ │ │ ├── LogicInstructionArrayExpanderTest.java
│ │ │ │ ├── LogicInstructionLabelResolverTest.java
│ │ │ │ └── LogicInstructionPrinterTest.java
│ │ │ └── preprocess
│ │ │ │ ├── DirectivePreprocessorTest.java
│ │ │ │ └── PreprocessorContextImpl.java
│ │ ├── decompiler
│ │ │ └── MlogDecompilerTest.java
│ │ ├── logic
│ │ │ ├── instructions
│ │ │ │ ├── BaseInstructionProcessorTest.java
│ │ │ │ └── BaseInstructionTest.java
│ │ │ ├── mimex
│ │ │ │ └── MindustryMetadataTest.java
│ │ │ └── opcodes
│ │ │ │ └── MindustryOpcodeVariantsTest.java
│ │ └── tests
│ │ │ ├── AbstractProcessorTest.java
│ │ │ ├── AlgorithmsSymbolicLabelsTest.java
│ │ │ ├── AlgorithmsTest.java
│ │ │ ├── AlgorithmsTestBase.java
│ │ │ ├── CaseSwitcherProcessorTest.java
│ │ │ ├── CaseSwitcherProcessorTestBase.java
│ │ │ ├── CaseSwitcherSymbolicLabelsProcessorTest.java
│ │ │ ├── EulerSymbolicLabelsTest.java
│ │ │ ├── EulerTest.java
│ │ │ ├── OptimizerSymbolicLabelsTest.java
│ │ │ ├── OptimizerTest.java
│ │ │ ├── ProcessorSymbolicLabelsTest.java
│ │ │ ├── ProcessorTest.java
│ │ │ ├── ProcessorTestBase.java
│ │ │ └── interceptor
│ │ │ ├── AbstractInterceptorTest.java
│ │ │ └── InterceptorTest.java
│ │ ├── profile
│ │ └── CompilerProfileTest.java
│ │ └── util
│ │ ├── CollectionUtilsTest.java
│ │ ├── IntRangeTest.java
│ │ └── StringSimilarityTest.java
│ └── resources
│ ├── info
│ └── teksol
│ │ └── mc
│ │ └── mindcode
│ │ └── tests
│ │ ├── algorithms
│ │ ├── AlgorithmsSymbolicLabelsTest.txt
│ │ ├── AlgorithmsTest.txt
│ │ ├── array-reversion-symbolic.log
│ │ ├── array-reversion.log
│ │ ├── array-reversion.mnd
│ │ ├── base64-decode-symbolic.log
│ │ ├── base64-decode.log
│ │ ├── base64-decode.mnd
│ │ ├── bubble-sort-symbolic.log
│ │ ├── bubble-sort.log
│ │ ├── bubble-sort.mnd
│ │ ├── compute-recursive-fibonacci-symbolic.log
│ │ ├── compute-recursive-fibonacci.log
│ │ ├── compute-recursive-fibonacci.mnd
│ │ ├── compute-sum-of-primes-symbolic.log
│ │ ├── compute-sum-of-primes.log
│ │ ├── compute-sum-of-primes.mnd
│ │ ├── digit-counts-symbolic.log
│ │ ├── digit-counts.log
│ │ ├── digit-counts.mnd
│ │ ├── heap-sort-symbolic.log
│ │ ├── heap-sort.log
│ │ ├── heap-sort.mnd
│ │ ├── insert-sort-symbolic.log
│ │ ├── insert-sort.log
│ │ ├── insert-sort.mnd
│ │ ├── memory-read-write-symbolic.log
│ │ ├── memory-read-write.log
│ │ ├── memory-read-write.mnd
│ │ ├── pascal-triangle-symbolic.log
│ │ ├── pascal-triangle.log
│ │ ├── pascal-triangle.mnd
│ │ ├── quick-sort-symbolic.log
│ │ ├── quick-sort.log
│ │ ├── quick-sort.mnd
│ │ ├── select-sort-symbolic.log
│ │ ├── select-sort.log
│ │ ├── select-sort.mnd
│ │ ├── storage-display-symbolic.log
│ │ ├── storage-display.log
│ │ └── storage-display.mnd
│ │ ├── caseswitcher
│ │ ├── CaseSwitcherConfigurationGeneratorTest.txt
│ │ ├── CaseSwitcherProcessorTest.txt
│ │ ├── CaseSwitcherSymbolicLabelsProcessorTest.txt
│ │ ├── distinct-0-none-limit-0-symbolic.log
│ │ ├── distinct-0-none-limit-0.log
│ │ ├── distinct-0-none-limit-110-symbolic.log
│ │ ├── distinct-0-none-limit-110.log
│ │ ├── distinct-0-none-limit-200-symbolic.log
│ │ ├── distinct-0-none-limit-200.log
│ │ ├── distinct-0-none-limit-500-symbolic.log
│ │ ├── distinct-0-none-limit-500.log
│ │ ├── distinct-0-none.mnd
│ │ ├── distinct-0-none.txt
│ │ ├── distinct-1-zero-limit-0-symbolic.log
│ │ ├── distinct-1-zero-limit-0.log
│ │ ├── distinct-1-zero-limit-110-symbolic.log
│ │ ├── distinct-1-zero-limit-110.log
│ │ ├── distinct-1-zero-limit-200-symbolic.log
│ │ ├── distinct-1-zero-limit-200.log
│ │ ├── distinct-1-zero-limit-500-symbolic.log
│ │ ├── distinct-1-zero-limit-500.log
│ │ ├── distinct-1-zero.mnd
│ │ ├── distinct-1-zero.txt
│ │ ├── distinct-2-null-limit-0-symbolic.log
│ │ ├── distinct-2-null-limit-0.log
│ │ ├── distinct-2-null-limit-110-symbolic.log
│ │ ├── distinct-2-null-limit-110.log
│ │ ├── distinct-2-null-limit-200-symbolic.log
│ │ ├── distinct-2-null-limit-200.log
│ │ ├── distinct-2-null-limit-500-symbolic.log
│ │ ├── distinct-2-null-limit-500.log
│ │ ├── distinct-2-null.mnd
│ │ ├── distinct-2-null.txt
│ │ ├── distinct-3-both-limit-0-symbolic.log
│ │ ├── distinct-3-both-limit-0.log
│ │ ├── distinct-3-both-limit-110-symbolic.log
│ │ ├── distinct-3-both-limit-110.log
│ │ ├── distinct-3-both-limit-200-symbolic.log
│ │ ├── distinct-3-both-limit-200.log
│ │ ├── distinct-3-both-limit-500-symbolic.log
│ │ ├── distinct-3-both-limit-500.log
│ │ ├── distinct-3-both.mnd
│ │ ├── distinct-3-both.txt
│ │ ├── distinct-4-max-limit-0-symbolic.log
│ │ ├── distinct-4-max-limit-0.log
│ │ ├── distinct-4-max-limit-110-symbolic.log
│ │ ├── distinct-4-max-limit-110.log
│ │ ├── distinct-4-max-limit-200-symbolic.log
│ │ ├── distinct-4-max-limit-200.log
│ │ ├── distinct-4-max-limit-500-symbolic.log
│ │ ├── distinct-4-max-limit-500.log
│ │ ├── distinct-4-max.mnd
│ │ ├── distinct-4-max.txt
│ │ ├── homogenous-0-none-limit-0-symbolic.log
│ │ ├── homogenous-0-none-limit-0.log
│ │ ├── homogenous-0-none-limit-100-symbolic.log
│ │ ├── homogenous-0-none-limit-100.log
│ │ ├── homogenous-0-none-limit-500-symbolic.log
│ │ ├── homogenous-0-none-limit-500.log
│ │ ├── homogenous-0-none-limit-60-symbolic.log
│ │ ├── homogenous-0-none-limit-60.log
│ │ ├── homogenous-0-none.mnd
│ │ ├── homogenous-0-none.txt
│ │ ├── homogenous-1-zero-limit-0-symbolic.log
│ │ ├── homogenous-1-zero-limit-0.log
│ │ ├── homogenous-1-zero-limit-100-symbolic.log
│ │ ├── homogenous-1-zero-limit-100.log
│ │ ├── homogenous-1-zero-limit-500-symbolic.log
│ │ ├── homogenous-1-zero-limit-500.log
│ │ ├── homogenous-1-zero-limit-60-symbolic.log
│ │ ├── homogenous-1-zero-limit-60.log
│ │ ├── homogenous-1-zero.mnd
│ │ ├── homogenous-1-zero.txt
│ │ ├── homogenous-2-null-limit-0-symbolic.log
│ │ ├── homogenous-2-null-limit-0.log
│ │ ├── homogenous-2-null-limit-100-symbolic.log
│ │ ├── homogenous-2-null-limit-100.log
│ │ ├── homogenous-2-null-limit-500-symbolic.log
│ │ ├── homogenous-2-null-limit-500.log
│ │ ├── homogenous-2-null-limit-60-symbolic.log
│ │ ├── homogenous-2-null-limit-60.log
│ │ ├── homogenous-2-null.mnd
│ │ ├── homogenous-2-null.txt
│ │ ├── homogenous-3-both-limit-0-symbolic.log
│ │ ├── homogenous-3-both-limit-0.log
│ │ ├── homogenous-3-both-limit-100-symbolic.log
│ │ ├── homogenous-3-both-limit-100.log
│ │ ├── homogenous-3-both-limit-500-symbolic.log
│ │ ├── homogenous-3-both-limit-500.log
│ │ ├── homogenous-3-both-limit-60-symbolic.log
│ │ ├── homogenous-3-both-limit-60.log
│ │ ├── homogenous-3-both.mnd
│ │ ├── homogenous-3-both.txt
│ │ ├── homogenous-4-max-limit-0-symbolic.log
│ │ ├── homogenous-4-max-limit-0.log
│ │ ├── homogenous-4-max-limit-100-symbolic.log
│ │ ├── homogenous-4-max-limit-100.log
│ │ ├── homogenous-4-max-limit-500-symbolic.log
│ │ ├── homogenous-4-max-limit-500.log
│ │ ├── homogenous-4-max-limit-60-symbolic.log
│ │ ├── homogenous-4-max-limit-60.log
│ │ ├── homogenous-4-max.mnd
│ │ ├── homogenous-4-max.txt
│ │ ├── mixed-2-null-limit-0-symbolic.log
│ │ ├── mixed-2-null-limit-0.log
│ │ ├── mixed-2-null-limit-140-symbolic.log
│ │ ├── mixed-2-null-limit-140.log
│ │ ├── mixed-2-null-limit-230-symbolic.log
│ │ ├── mixed-2-null-limit-230.log
│ │ ├── mixed-2-null-limit-500-symbolic.log
│ │ ├── mixed-2-null-limit-500.log
│ │ ├── mixed-2-null.mnd
│ │ └── mixed-2-null.txt
│ │ ├── euler
│ │ ├── EulerSymbolicLabelsTest.txt
│ │ ├── EulerTest.txt
│ │ ├── ProjectEulerTest.txt
│ │ ├── project-euler-04-symbolic.log
│ │ ├── project-euler-04.log
│ │ ├── project-euler-04.mnd
│ │ ├── project-euler-18-symbolic.log
│ │ ├── project-euler-18.log
│ │ ├── project-euler-18.mnd
│ │ ├── project-euler-26-symbolic.log
│ │ ├── project-euler-26.log
│ │ ├── project-euler-26.mnd
│ │ ├── project-euler-28-symbolic.log
│ │ ├── project-euler-28.log
│ │ ├── project-euler-28.mnd
│ │ ├── project-euler-31-symbolic.log
│ │ ├── project-euler-31.log
│ │ ├── project-euler-31.mnd
│ │ ├── project-euler-31b-symbolic.log
│ │ ├── project-euler-31b.log
│ │ ├── project-euler-31b.mnd
│ │ ├── project-euler-45-symbolic.log
│ │ ├── project-euler-45.log
│ │ ├── project-euler-45.mnd
│ │ ├── project-euler-97-symbolic.log
│ │ ├── project-euler-97.log
│ │ └── project-euler-97.mnd
│ │ ├── optimizer
│ │ ├── OptimizerSymbolicLabelsTest.txt
│ │ ├── OptimizerTest.txt
│ │ ├── breakout-00-symbolic.log
│ │ ├── breakout-00.log
│ │ ├── breakout-00.mnd
│ │ ├── detector-00-symbolic.log
│ │ ├── detector-00.log
│ │ ├── detector-00.mnd
│ │ ├── factory-monitor-00-symbolic.log
│ │ ├── factory-monitor-00.log
│ │ ├── factory-monitor-00.mnd
│ │ ├── factory-monitor-silicon-00-symbolic.log
│ │ ├── factory-monitor-silicon-00.log
│ │ ├── factory-monitor-silicon-00.mnd
│ │ ├── factory-monitor-surge-alloy-00-symbolic.log
│ │ ├── factory-monitor-surge-alloy-00.log
│ │ ├── factory-monitor-surge-alloy-00.mnd
│ │ ├── impact-reactor-logic-00-symbolic.log
│ │ ├── impact-reactor-logic-00.log
│ │ ├── impact-reactor-logic-00.mnd
│ │ ├── instant-overdrive-dome-01-symbolic.log
│ │ ├── instant-overdrive-dome-01.log
│ │ ├── instant-overdrive-dome-01.mnd
│ │ ├── item-counter-00-symbolic.log
│ │ ├── item-counter-00.log
│ │ ├── item-counter-00.mnd
│ │ ├── item-counter-micro-00-symbolic.log
│ │ ├── item-counter-micro-00.log
│ │ ├── item-counter-micro-00.mnd
│ │ ├── item-rate-display-00-symbolic.log
│ │ ├── item-rate-display-00.log
│ │ ├── item-rate-display-00.mnd
│ │ ├── item-rate-meter-00-symbolic.log
│ │ ├── item-rate-meter-00.log
│ │ ├── item-rate-meter-00.mnd
│ │ ├── level-display-00-symbolic.log
│ │ ├── level-display-00.log
│ │ ├── level-display-00.mnd
│ │ ├── level-display-water-cryo-00-symbolic.log
│ │ ├── level-display-water-cryo-00.log
│ │ ├── level-display-water-cryo-00.mnd
│ │ ├── level-meter-00-symbolic.log
│ │ ├── level-meter-00.log
│ │ ├── level-meter-00.mnd
│ │ ├── map-setup-00-symbolic.log
│ │ ├── map-setup-00.log
│ │ ├── map-setup-00.mnd
│ │ ├── mass-driver-monitor-00-symbolic.log
│ │ ├── mass-driver-monitor-00.log
│ │ ├── mass-driver-monitor-00.mnd
│ │ ├── mass-driver-monitor-surge-alloy-00-symbolic.log
│ │ ├── mass-driver-monitor-surge-alloy-00.log
│ │ ├── mass-driver-monitor-surge-alloy-00.mnd
│ │ ├── reactor-control-00-symbolic.log
│ │ ├── reactor-control-00.log
│ │ ├── reactor-control-00.mnd
│ │ ├── reactor-control-battery-level-00-symbolic.log
│ │ ├── reactor-control-battery-level-00.log
│ │ ├── reactor-control-battery-level-00.mnd
│ │ ├── regulator-00-symbolic.log
│ │ ├── regulator-00.log
│ │ ├── regulator-00.mnd
│ │ ├── remote-vault-00-symbolic.log
│ │ ├── remote-vault-00.log
│ │ ├── remote-vault-00.mnd
│ │ ├── storage-display-00-symbolic.log
│ │ ├── storage-display-00.log
│ │ ├── storage-display-00.mnd
│ │ ├── unit-housekeeping-00-symbolic.log
│ │ ├── unit-housekeeping-00.log
│ │ ├── unit-housekeeping-00.mnd
│ │ ├── unit-speed-00-symbolic.log
│ │ ├── unit-speed-00.log
│ │ ├── unit-speed-00.mnd
│ │ ├── unit-transport-00-symbolic.log
│ │ ├── unit-transport-00.log
│ │ ├── unit-transport-00.mnd
│ │ ├── unit-transport-flow-rate-00-symbolic.log
│ │ ├── unit-transport-flow-rate-00.log
│ │ ├── unit-transport-flow-rate-00.mnd
│ │ ├── unit-transport-single-00-symbolic.log
│ │ ├── unit-transport-single-00.log
│ │ └── unit-transport-single-00.mnd
│ │ └── processor
│ │ ├── ProcessorSymbolicLabelsTest.txt
│ │ ├── ProcessorTest.txt
│ │ ├── assignments-in-expressions-symbolic.log
│ │ ├── assignments-in-expressions.log
│ │ ├── assignments-in-expressions.mnd
│ │ ├── complex-case-expression-symbolic.log
│ │ ├── complex-case-expression.log
│ │ ├── complex-case-expression.mnd
│ │ ├── equality-comparisons-symbolic.log
│ │ ├── equality-comparisons.log
│ │ ├── equality-comparisons.mnd
│ │ ├── executes-sort-variables-symbolic.log
│ │ ├── executes-sort-variables.log
│ │ ├── executes-sort-variables.mnd
│ │ ├── expression-evaluation-compile-time-symbolic.log
│ │ ├── expression-evaluation-compile-time.log
│ │ ├── expression-evaluation-compile-time.mnd
│ │ ├── expression-evaluation-runtime-symbolic.log
│ │ ├── expression-evaluation-runtime.log
│ │ ├── expression-evaluation-runtime.mnd
│ │ ├── fixed-bounds-ranged-for-symbolic.log
│ │ ├── fixed-bounds-ranged-for.log
│ │ ├── fixed-bounds-ranged-for.mnd
│ │ ├── for-each-loop-break-continue-symbolic.log
│ │ ├── for-each-loop-break-continue.log
│ │ ├── for-each-loop-break-continue.mnd
│ │ ├── function-inlining-symbolic.log
│ │ ├── function-inlining.log
│ │ ├── function-inlining.mnd
│ │ ├── iterated-for-loop-break-continue-symbolic.log
│ │ ├── iterated-for-loop-break-continue.log
│ │ ├── iterated-for-loop-break-continue.mnd
│ │ ├── loops-in-conditions-symbolic.log
│ │ ├── loops-in-conditions.log
│ │ ├── loops-in-conditions.mnd
│ │ ├── prints-values-symbolic.log
│ │ ├── prints-values.log
│ │ ├── prints-values.mnd
│ │ ├── ranged-for-loop-break-continue-symbolic.log
│ │ ├── ranged-for-loop-break-continue.log
│ │ ├── ranged-for-loop-break-continue.mnd
│ │ ├── recursive-calls-symbolic.log
│ │ ├── recursive-calls.log
│ │ ├── recursive-calls.mnd
│ │ ├── recursive-function-condition-symbolic.log
│ │ ├── recursive-function-condition.log
│ │ ├── recursive-function-condition.mnd
│ │ ├── switched-case-expression-symbolic.log
│ │ ├── switched-case-expression.log
│ │ ├── switched-case-expression.mnd
│ │ ├── while-loop-symbolic.log
│ │ ├── while-loop.log
│ │ └── while-loop.mnd
│ ├── junit-platform.properties
│ └── library
│ ├── outputs
│ ├── arrays-advanced.log
│ ├── arrays-advanced.mlog
│ ├── arrays-basic.log
│ ├── arrays-basic.mlog
│ ├── arrays-experimental.log
│ ├── arrays-experimental.mlog
│ ├── arrays-none.log
│ ├── arrays-none.mlog
│ ├── arrays.mnd
│ ├── blocks-advanced.log
│ ├── blocks-advanced.mlog
│ ├── blocks-basic.log
│ ├── blocks-basic.mlog
│ ├── blocks-experimental.log
│ ├── blocks-experimental.mlog
│ ├── blocks-none.log
│ ├── blocks-none.mlog
│ ├── blocks.mnd
│ ├── graphics-advanced.log
│ ├── graphics-advanced.mlog
│ ├── graphics-basic.log
│ ├── graphics-basic.mlog
│ ├── graphics-experimental.log
│ ├── graphics-experimental.mlog
│ ├── graphics-none.log
│ ├── graphics-none.mlog
│ ├── graphics.mnd
│ ├── math-advanced.log
│ ├── math-advanced.mlog
│ ├── math-basic.log
│ ├── math-basic.mlog
│ ├── math-experimental.log
│ ├── math-experimental.mlog
│ ├── math-none.log
│ ├── math-none.mlog
│ ├── math.mnd
│ ├── printing-advanced.log
│ ├── printing-advanced.mlog
│ ├── printing-basic.log
│ ├── printing-basic.mlog
│ ├── printing-experimental.log
│ ├── printing-experimental.mlog
│ ├── printing-none.log
│ ├── printing-none.mlog
│ ├── printing.mnd
│ ├── units-advanced.log
│ ├── units-advanced.mlog
│ ├── units-basic.log
│ ├── units-basic.mlog
│ ├── units-experimental.log
│ ├── units-experimental.mlog
│ ├── units-none.log
│ ├── units-none.mlog
│ ├── units.mnd
│ └── utils.log
│ └── tests
│ ├── arrays.mnd
│ ├── blocks.mnd
│ ├── graphics.mnd
│ ├── math.txt
│ └── printing.txt
├── doc
├── announcements
│ ├── 2021-03-16.markdown
│ ├── 2021-03-18.markdown
│ ├── 2021-03-27.markdown
│ └── 2023-03-29.markdown
└── syntax
│ ├── FUNCTIONS-60.markdown
│ ├── FUNCTIONS-70.markdown
│ ├── FUNCTIONS-71.markdown
│ ├── FUNCTIONS-80.markdown
│ ├── FUNCTIONS-81.markdown
│ ├── MINDUSTRY-8.markdown
│ ├── MINDUSTRY-TIPS-N-TRICKS.markdown
│ ├── PERFORMANCE-TIPS.markdown
│ ├── REMOTE-CALLS.markdown
│ ├── SCHEMACODE.markdown
│ ├── SYNTAX-1-VARIABLES.markdown
│ ├── SYNTAX-2-EXPRESSIONS.markdown
│ ├── SYNTAX-3-STATEMENTS.markdown
│ ├── SYNTAX-4-FUNCTIONS.markdown
│ ├── SYNTAX-5-OTHER.markdown
│ ├── SYNTAX-6-OPTIMIZATIONS.markdown
│ ├── SYNTAX-EXTENSIONS.markdown
│ ├── SYNTAX.markdown
│ ├── SYSTEM-LIBRARY-ARRAYS.markdown
│ ├── SYSTEM-LIBRARY-BLOCKS.markdown
│ ├── SYSTEM-LIBRARY-COMPATIBILITY.markdown
│ ├── SYSTEM-LIBRARY-GRAPHICS.markdown
│ ├── SYSTEM-LIBRARY-MATH.markdown
│ ├── SYSTEM-LIBRARY-PRINTING.markdown
│ ├── SYSTEM-LIBRARY-UNITS.markdown
│ ├── SYSTEM-LIBRARY.markdown
│ ├── TOOLS-CMDLINE.markdown
│ ├── TOOLS-IDE-INTEGRATION.markdown
│ ├── TOOLS-MLOG-DECOMPILER.markdown
│ ├── TOOLS-MLOG-WATCHER.markdown
│ ├── TOOLS-PROCESSOR-EMULATOR.markdown
│ ├── TOOLS-REFRESHER.markdown
│ ├── TOOLS-TESTING-TOOL.markdown
│ ├── TROUBLESHOOTING.markdown
│ └── TUTORIAL-MINDCODE.markdown
├── docker-compose.yaml
├── errors
├── 001-loop-unroller.log
├── 001-loop-unroller.mlog
├── 001-loop-unroller.mnd
├── 002-dfo.log
├── 002-dfo.mlog
└── 002-dfo.mnd
├── exttest
├── .gitignore
├── data
│ ├── bubble-sort.mnd
│ ├── case-distinct-both.mnd
│ ├── case-distinct-max.mnd
│ ├── case-distinct-none.mnd
│ ├── case-distinct-null.mnd
│ ├── case-distinct-zero.mnd
│ ├── case-homogenous-both.mnd
│ ├── case-homogenous-max.mnd
│ ├── case-homogenous-none.mnd
│ ├── case-homogenous-null.mnd
│ ├── case-homogenous-zero.mnd
│ ├── case-no-else.mnd
│ ├── case-range.mnd
│ ├── case-small.mnd
│ ├── case-variable.mnd
│ ├── heap-sort.mnd
│ ├── impact-reactor-logic.mnd
│ ├── math.mnd
│ ├── printing.mnd
│ ├── quick-sort.mnd
│ ├── recursion.mnd
│ ├── settings.yaml
│ └── sum-of-primes.mnd
├── pom.xml
└── src
│ ├── main
│ └── java
│ │ └── info
│ │ └── teksol
│ │ └── mindcode
│ │ └── exttest
│ │ ├── AbstractTestProgress.java
│ │ ├── BasicTestProgress.java
│ │ ├── Configuration.java
│ │ ├── ConfigurationReader.java
│ │ ├── ErrorResult.java
│ │ ├── ExecutionFramework.java
│ │ ├── ExtendedTests.java
│ │ ├── ScreeningTestProgress.java
│ │ ├── TestConfiguration.java
│ │ ├── TestProgress.java
│ │ ├── cases
│ │ ├── BaseTestCaseCreator.java
│ │ ├── BasicTestCaseExecutor.java
│ │ ├── CaseSwitchingTestCaseExecutor.java
│ │ ├── TestCaseCreator.java
│ │ ├── TestCaseCreatorFull.java
│ │ ├── TestCaseCreatorSampled.java
│ │ ├── TestCaseCreatorScreening.java
│ │ └── TestCaseExecutor.java
│ │ ├── forkjoin
│ │ ├── ForkJoinFramework.java
│ │ └── ForkJoinTestRunner.java
│ │ └── threadpool
│ │ ├── ThreadPoolFramework.java
│ │ └── ThreadPoolRunner.java
│ └── test
│ ├── java
│ └── info
│ │ └── teksol
│ │ └── mindcode
│ │ └── exttest
│ │ ├── ExtendedTestsTest.java
│ │ └── cases
│ │ └── TestCaseCreatorSampledTest.java
│ └── resources
│ └── junit-platform.properties
├── java
└── util
│ └── annotations.xml
├── logo.png
├── mvnw
├── mvnw.cmd
├── pom.xml
├── samples
├── .gitignore
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── info
│ │ │ └── teksol
│ │ │ └── mindcode
│ │ │ └── samples
│ │ │ ├── Sample.java
│ │ │ └── Samples.java
│ └── resources
│ │ └── samples
│ │ ├── mindcode
│ │ ├── control-multiple-units.mnd
│ │ ├── heal-damaged-building.mnd
│ │ ├── item-transport.mnd
│ │ ├── many-thorium.mnd
│ │ ├── mining-drone.mnd
│ │ ├── one-thorium.mnd
│ │ ├── sum-of-primes.mnd
│ │ └── upgrade-conveyors.mnd
│ │ └── schematics
│ │ ├── detector.sdf
│ │ ├── healing-center.sdf
│ │ ├── item-transport.sdf
│ │ ├── mandelbrot-generator.sdf
│ │ ├── on-off-switch.sdf
│ │ ├── overdrive-dome-supply.sdf
│ │ ├── payload-hub.sdf
│ │ ├── regulator.sdf
│ │ ├── scrap-to-metaglass-2.sdf
│ │ └── worker-recall-station.sdf
│ └── test
│ ├── java
│ └── info
│ │ └── teksol
│ │ └── mindcode
│ │ └── samples
│ │ └── SamplesTest.java
│ └── resources
│ └── junit-platform.properties
├── schemacode
├── pom.xml
└── src
│ ├── main
│ └── java
│ │ └── info
│ │ └── teksol
│ │ └── schemacode
│ │ ├── IOConsumer.java
│ │ ├── IOSupplier.java
│ │ ├── SchemacodeCompiler.java
│ │ ├── SchemacodeErrorListener.java
│ │ ├── SchematicsDecompiler.java
│ │ ├── SchematicsInternalError.java
│ │ ├── SchematicsMetadata.java
│ │ ├── ast
│ │ ├── AstBlock.java
│ │ ├── AstBlockReference.java
│ │ ├── AstBoolean.java
│ │ ├── AstColor.java
│ │ ├── AstConfiguration.java
│ │ ├── AstConnection.java
│ │ ├── AstConnections.java
│ │ ├── AstContentsReference.java
│ │ ├── AstCoordinates.java
│ │ ├── AstDefinition.java
│ │ ├── AstDefinitions.java
│ │ ├── AstDirection.java
│ │ ├── AstItemReference.java
│ │ ├── AstLink.java
│ │ ├── AstLinkPattern.java
│ │ ├── AstLinkPos.java
│ │ ├── AstLiquidReference.java
│ │ ├── AstProcessor.java
│ │ ├── AstProgram.java
│ │ ├── AstProgramSnippet.java
│ │ ├── AstProgramSnippetFile.java
│ │ ├── AstProgramSnippetText.java
│ │ ├── AstRgbaValue.java
│ │ ├── AstSchemaAttribute.java
│ │ ├── AstSchemaItem.java
│ │ ├── AstSchematic.java
│ │ ├── AstSchematicsBuilder.java
│ │ ├── AstStringBlock.java
│ │ ├── AstStringConstant.java
│ │ ├── AstStringLiteral.java
│ │ ├── AstStringRef.java
│ │ ├── AstText.java
│ │ ├── AstUnitCommandReference.java
│ │ ├── AstUnitReference.java
│ │ ├── AstVirtual.java
│ │ └── MultipartPositionTranslator.java
│ │ ├── config
│ │ ├── Array.java
│ │ ├── BooleanConfiguration.java
│ │ ├── ByteArray.java
│ │ ├── Configuration.java
│ │ ├── DoubleConfiguration.java
│ │ ├── EmptyConfiguration.java
│ │ ├── FloatConfiguration.java
│ │ ├── IntConfiguration.java
│ │ ├── LongConfiguration.java
│ │ ├── PositionArray.java
│ │ ├── TextConfiguration.java
│ │ └── UnhandledItem.java
│ │ ├── grammar
│ │ ├── Schemacode.g4
│ │ ├── Schemacode.interp
│ │ ├── Schemacode.tokens
│ │ ├── SchemacodeBaseListener.java
│ │ ├── SchemacodeBaseVisitor.java
│ │ ├── SchemacodeLexer.interp
│ │ ├── SchemacodeLexer.java
│ │ ├── SchemacodeLexer.tokens
│ │ ├── SchemacodeListener.java
│ │ ├── SchemacodeParser.java
│ │ └── SchemacodeVisitor.java
│ │ ├── mindustry
│ │ ├── BlockConfiguration.java
│ │ ├── Color.java
│ │ ├── ConfigurationType.java
│ │ ├── ContentConfiguration.java
│ │ ├── Direction.java
│ │ ├── Implementation.java
│ │ ├── ItemConfiguration.java
│ │ ├── LiquidConfiguration.java
│ │ ├── Position.java
│ │ ├── ProcessorConfiguration.java
│ │ ├── SchematicsIO.java
│ │ ├── UnitCommandConfiguration.java
│ │ ├── UnitConfiguration.java
│ │ ├── UnitOrBlockConfiguration.java
│ │ ├── UnitPlan.java
│ │ └── Vector.java
│ │ └── schematics
│ │ ├── Block.java
│ │ ├── BlockOrder.java
│ │ ├── BlockPosition.java
│ │ ├── BlockPositionMap.java
│ │ ├── BlockPositionResolver.java
│ │ ├── BridgeSolver.java
│ │ ├── Decompiler.java
│ │ ├── DirectionLevel.java
│ │ ├── Language.java
│ │ ├── PowerGridSolver.java
│ │ ├── Schematic.java
│ │ └── SchematicsBuilder.java
│ └── test
│ ├── java
│ └── info
│ │ └── teksol
│ │ └── schemacode
│ │ ├── AbstractSchematicsTest.java
│ │ ├── ast
│ │ ├── AstSchematicBuilderTest.java
│ │ └── MultipartPositionTranslatorTest.java
│ │ ├── mindustry
│ │ ├── ImplementationTest.java
│ │ └── SchematicsIOTest.java
│ │ └── schematics
│ │ ├── BlockPositionMapTest.java
│ │ ├── BridgeSolverTest.java
│ │ ├── DecompilerTest.java
│ │ ├── PowerGridSolverTest.java
│ │ └── SchematicsBuilderTest.java
│ └── resources
│ ├── junit-platform.properties
│ └── schematics
│ ├── detector.msch
│ ├── driver-monitor-for-surge-alloy-factory.msch
│ ├── factory-monitor-silicon.msch
│ ├── factory-monitor-surge-alloy.msch
│ ├── factory-monitor.msch
│ ├── impact-power-plant.msch
│ ├── instant-overdrive-dome.msch
│ ├── instant-overdrive-projector.msch
│ ├── item-counter.msch
│ ├── item-rate-display.msch
│ ├── item-rate-meter.msch
│ ├── level-display.msch
│ ├── level-meter-water+cryo.msch
│ ├── level-meter.msch
│ ├── mass-driver-monitor.msch
│ ├── regulator.msch
│ ├── sample.msch
│ └── unit-transport-single.msch
├── support
└── idea
│ ├── settings-filetypes.zip
│ ├── settings-tools-linux.zip
│ └── settings-tools-windows.zip
├── system.properties
├── toolapp
├── .gitignore
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── info
│ │ │ └── teksol
│ │ │ └── mindcode
│ │ │ └── cmdline
│ │ │ ├── ActionHandler.java
│ │ │ ├── CaseInsensitiveChoices.java
│ │ │ ├── CompileMindcodeAction.java
│ │ │ ├── CompileSchemacodeAction.java
│ │ │ ├── ConsoleMessageLogger.java
│ │ │ ├── DecompileMlogAction.java
│ │ │ ├── DecompileSchemacodeAction.java
│ │ │ ├── ExcerptSpecification.java
│ │ │ ├── LowerCaseEnumArgumentType.java
│ │ │ ├── Main.java
│ │ │ ├── MlogWatcherClient.java
│ │ │ └── ProcessingException.java
│ └── resources
│ │ └── META-INF
│ │ └── MANIFEST.MF
│ └── test
│ ├── java
│ └── info
│ │ └── teksol
│ │ └── mindcode
│ │ ├── cmdline
│ │ ├── AbstractCommandLineTest.java
│ │ ├── CommandLineHelpGeneratorTest.java
│ │ ├── CompileMindcodeActionTest.java
│ │ ├── CompileSchemacodeActionTest.java
│ │ └── DecompileSchemacodeActionTest.java
│ │ └── ide
│ │ └── idea
│ │ └── CreateIdeaSettingsTest.java
│ └── resources
│ ├── ide
│ └── idea
│ │ ├── IntelliJ IDEA Global Settings
│ │ ├── filetypes
│ │ ├── Mindcode.xml
│ │ ├── Schema Definition File.xml
│ │ └── mlog.xml
│ │ ├── installed.txt
│ │ ├── tools-linux
│ │ └── External Tools.xml
│ │ └── tools-windows
│ │ └── External Tools.xml
│ └── templates
│ └── TOOLS-CMDLINE_template.markdown
├── webapp
├── .gitignore
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── info
│ │ │ └── teksol
│ │ │ └── mindcode
│ │ │ └── webapp
│ │ │ ├── DbMigrator.java
│ │ │ ├── DecompilerController.java
│ │ │ ├── HomeController.java
│ │ │ ├── HomePageData.java
│ │ │ ├── MlogDecompilerController.java
│ │ │ ├── SchematicsController.java
│ │ │ ├── Source.java
│ │ │ ├── SourceRepository.java
│ │ │ ├── WebappApplication.java
│ │ │ └── WebappMessage.java
│ └── resources
│ │ ├── application.properties
│ │ ├── logback.xml
│ │ └── templates
│ │ ├── common.ftlh
│ │ ├── decompiler.ftlh
│ │ ├── home.ftlh
│ │ ├── mlog-decompiler.ftlh
│ │ └── schematic.ftlh
│ └── test
│ ├── java
│ └── info
│ │ └── teksol
│ │ └── mindcode
│ │ └── webapp
│ │ ├── WebAppSchematicsBuilderTest.java
│ │ └── WebappApplicationTests.java
│ └── resources
│ ├── application.properties
│ └── logback-test.xml
└── wide-logo.png
/.gitattributes:
--------------------------------------------------------------------------------
1 | mvnw text eol=lf
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Files which don't need to be shared between developers
2 | .idea/dataSources*
3 | .idea/dictionaries
4 | .idea/libraries
5 | .idea/vcs.xml
6 | .idea/workspace.xml
7 | .idea/dbnavigator.xml
8 | .idea/codeStyles/Project.xml
9 | .idea/templateLanguages.xml
10 |
11 | # PostgreSQL cluster data directory
12 | db/cluster
13 |
14 | # Compiled artifacts
15 | Instruction_Samples_*.txt
16 | trace*.txt
17 | scratches/
18 | out/
19 | target
20 | tmp
21 | mindcode/src/test/resources/scripts/*.mlog
22 | mindcode/src/test/resources/euler/*.mlog
23 |
24 | # System library log files
25 | mindcode/src/main/resources/library/*.log
26 | mindcode/src/main/resources/library/*.mlog
27 |
28 |
29 | # Other
30 | *.orig
31 | .flattened-pom.xml
32 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "compiler/src/main/resources/mimex"]
2 | path = compiler/src/main/resources/mimex
3 | url = https://github.com/cardillan/mimex-data.git
4 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/.idea/LanguageServersSettings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/.idea/artifacts/mindcode_compiler_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | $PROJECT_DIR$/out/artifacts/mindcode_compiler_jar
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cardillan/mindcode/ed0453b0cd24b5cff4d623923c79bbcc3e3191ba/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
3 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM eclipse-temurin:22
2 |
3 | WORKDIR /srv
4 |
5 | RUN apt update && apt -y install maven
6 |
7 | COPY pom.xml pom.xml
8 | COPY annotations/pom.xml annotations/pom.xml
9 | COPY compiler/pom.xml compiler/pom.xml
10 | COPY exttest/pom.xml exttest/pom.xml
11 | COPY samples/pom.xml samples/pom.xml
12 | COPY schemacode/pom.xml schemacode/pom.xml
13 | COPY toolapp/pom.xml toolapp/pom.xml
14 | COPY webapp/pom.xml webapp/pom.xml
15 |
16 | RUN mvn dependency:go-offline
17 |
18 | COPY . .
19 |
20 | ENV SPRING_DATASOURCE_URL jdbc:postgresql://mindcode-db/mindcode_development
21 | ENV SPRING_DATASOURCE_USERNAME postgres
22 | ENV SPRING_DATASOURCE_PASSWORD pg_password
23 |
24 | # Skip tests because postgres is only available at runtime
25 | RUN mvn install -Dmaven.test.skip
26 |
27 | EXPOSE 8080
28 |
29 | CMD java -classpath `find webapp -type f -name '*.jar' | tr '\n' ':'` info.teksol.mindcode.webapp.WebappApplication
30 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: java -Dserver.port=${PORT} -classpath $( find webapp -type f -name '*.jar' | tr '\n' ':' ) info.teksol.mindcode.webapp.WebappApplication
2 |
--------------------------------------------------------------------------------
/SYNTAX.markdown:
--------------------------------------------------------------------------------
1 | > [!NOTE]
2 | > Mindcode syntax documentation has been expanded and moved [here](doc/syntax/SYNTAX.markdown).
3 |
--------------------------------------------------------------------------------
/annotations/src/main/java/info/teksol/annotations/AstNode.java:
--------------------------------------------------------------------------------
1 | package info.teksol.annotations;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Retention(RetentionPolicy.SOURCE)
9 | @Target(ElementType.TYPE)
10 | public @interface AstNode {
11 | boolean printFlat() default false;
12 | }
13 |
--------------------------------------------------------------------------------
/annotations/src/main/java/info/teksol/annotations/BaseClass.java:
--------------------------------------------------------------------------------
1 | package info.teksol.annotations;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /** Marks a base class used as a supertype for generated subclasses of given category */
9 | @Retention(RetentionPolicy.SOURCE)
10 | @Target(ElementType.TYPE)
11 | public @interface BaseClass {
12 | String value();
13 | }
14 |
--------------------------------------------------------------------------------
/bin/build:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | $MINDCODE_PATH/mvnw install
4 |
--------------------------------------------------------------------------------
/bin/dbconsole:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | exec psql -h localhost -d mindcode_development
3 |
--------------------------------------------------------------------------------
/bin/deploy:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | exec git push heroku main:master
3 |
--------------------------------------------------------------------------------
/bin/mindcode:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | BASEDIR=$(dirname "$0")
3 | exec java -jar $BASEDIR/../toolapp/target/mindcode.jar "$@"
4 |
--------------------------------------------------------------------------------
/bin/mindcode.bat:
--------------------------------------------------------------------------------
1 | @"%JAVA_HOME%\bin\java.exe" -jar %~dp0..\toolapp\target\mindcode.jar %*
2 |
--------------------------------------------------------------------------------
/bin/webapp.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | setlocal enableDelayedExpansion
3 | pushd %~dp0..\webapp\target
4 | for %%i in (*.jar) do set __CLPATH=..\%%i
5 | cd dependency
6 | for %%i in (*.jar) do set __CLPATH=!__CLPATH!;%%i
7 | "%JAVA_HOME%\bin\java.exe" -classpath !__CLPATH! info.teksol.mindcode.webapp.WebappApplication %*
8 | popd
9 | endlocal
10 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/Version.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | import java.io.IOException;
6 | import java.io.InputStream;
7 | import java.util.Properties;
8 |
9 | @NullMarked
10 | public class Version {
11 |
12 | public static String getVersion() {
13 | try (InputStream in = Version.class.getResourceAsStream("mindcode.properties")) {
14 | if (in == null) {
15 | return "unknown";
16 | }
17 | Properties properties = new Properties();
18 | properties.load(in);
19 | return properties.getProperty("mindcode.version");
20 | } catch (IOException e) {
21 | throw new RuntimeException("Error obtaining version information", e);
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/common/InputFile.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.common;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | import java.nio.file.Path;
6 |
7 | @NullMarked
8 | public interface InputFile {
9 | int getId();
10 |
11 | /// @return true if this file is a standalone source (i.e. not loaded from existing file or library
12 | boolean isStandaloneSource();
13 |
14 | /// @return true if this file is a system library
15 | boolean isLibrary();
16 |
17 | /// @return source code of this file
18 | String getCode();
19 |
20 | /// @return path to the file as given when loaded
21 | Path getPath();
22 |
23 | /// @return relative path to the root of all input files (if applicable)
24 | Path getRelativePath();
25 |
26 | /// @return absolute, normalized path of the file
27 | String getAbsolutePath();
28 |
29 | /// @return distinct path for displaying in log files
30 | String getDistinctPath();
31 |
32 | /// @return distinct title for displaying in log files
33 | String getDistinctTitle();
34 | }
35 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/common/PositionFormatter.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.common;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | import java.util.function.Function;
6 |
7 | @FunctionalInterface
8 | @NullMarked
9 | public interface PositionFormatter extends Function {
10 | @Override
11 | default String apply(SourcePosition position) {
12 | return formatPosition(position);
13 | }
14 |
15 | String formatPosition(SourcePosition position);
16 | }
17 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/common/SourceElement.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.common;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | /// An instance which can be tied to a particular position in the source file. Typically, AST tree
6 | /// nodes are instances of source element, but some other classes can also implement this interface
7 | /// to provide the source position.
8 | @NullMarked
9 | public interface SourceElement {
10 |
11 | /// Provides the input position of the source element corresponding to this object.
12 | /// When the object doesn't have a corresponding source element, it should return
13 | /// `SourcePosition.EMPTY`.
14 | ///
15 | /// @return position of the source element corresponding to this object in the source code
16 | SourcePosition sourcePosition();
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/emulator/AbstractMindustryObject.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.emulator;
2 |
3 | import info.teksol.mc.mindcode.logic.mimex.MindustryContent;
4 | import org.jspecify.annotations.NullMarked;
5 | import org.jspecify.annotations.Nullable;
6 |
7 | import java.util.Objects;
8 |
9 | @NullMarked
10 | public class AbstractMindustryObject implements MindustryObject {
11 | private final String name;
12 | private final int id;
13 | private @Nullable final MindustryContent type;
14 |
15 | public AbstractMindustryObject(String name, int id, @Nullable MindustryContent type) {
16 | this.name = Objects.requireNonNull(name);
17 | this.id = id;
18 | this.type = type;
19 | }
20 |
21 | @Override
22 | public String name() {
23 | return name;
24 | }
25 |
26 | @Override
27 | public String format() {
28 | return name();
29 | }
30 |
31 | @Override
32 | public int id() {
33 | return id;
34 | }
35 |
36 | @Override
37 | public @Nullable MindustryContent type() {
38 | return type;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/emulator/MindustryString.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.emulator;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public class MindustryString extends AbstractMindustryObject {
7 |
8 | public MindustryString(String name) {
9 | super(name, -1, null);
10 | }
11 |
12 | public String value() {
13 | return name();
14 | }
15 |
16 | @Override
17 | public boolean equals(Object obj) {
18 | return obj != null && obj.getClass() == this.getClass() && ((MindustryString) obj).name().equals(name());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/emulator/blocks/MessageBlock.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.emulator.blocks;
2 |
3 | import info.teksol.mc.emulator.processor.TextBuffer;
4 | import info.teksol.mc.mindcode.logic.mimex.MindustryContent;
5 | import info.teksol.mc.mindcode.logic.mimex.MindustryMetadata;
6 | import org.jspecify.annotations.NullMarked;
7 |
8 | @NullMarked
9 | public class MessageBlock extends MindustryBlock {
10 | private final StringBuilder contents = new StringBuilder();
11 |
12 | public MessageBlock(String name, MindustryContent type) {
13 | super(name, type);
14 | }
15 |
16 | public void printflush(TextBuffer textBuffer) {
17 | textBuffer.printflush(contents);
18 | }
19 |
20 | public static MessageBlock createMessage(MindustryMetadata metadata) {
21 | return new MessageBlock("message", metadata.getExistingBlock("@message"));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/emulator/blocks/MindustryBlock.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.emulator.blocks;
2 |
3 | import info.teksol.mc.emulator.AbstractMindustryObject;
4 | import info.teksol.mc.mindcode.logic.mimex.MindustryContent;
5 | import org.jspecify.annotations.NullMarked;
6 |
7 | import java.util.Objects;
8 |
9 | @NullMarked
10 | public class MindustryBlock extends AbstractMindustryObject {
11 |
12 | public MindustryBlock(String name, MindustryContent type) {
13 | super(name, -1, Objects.requireNonNull(type));
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/emulator/blocks/graphics/TransformationMatrix.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.emulator.blocks.graphics;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | /// Represents the transformation matrix. Is shared among displays.
6 | ///
7 | /// In Mindustry Logic, the matrix is owned by the processor and applied to whichever display
8 | /// the drawflush is being called. The same needs to be done here.
9 | @NullMarked
10 | public class TransformationMatrix {
11 | }
12 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/evaluator/LogicCondition.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.evaluator;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | /// Interface representing a Mindustry Logic condition.
6 | @NullMarked
7 | public interface LogicCondition {
8 | boolean evaluate(LogicReadable a, LogicReadable b);
9 | }
10 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/evaluator/LogicOperation.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.evaluator;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | /// Interface representing a Mindustry Logic operation.
6 | @NullMarked
7 | public interface LogicOperation {
8 | void execute(LogicWritable result, LogicReadable left, LogicReadable right);
9 | }
10 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/evaluator/LogicWritable.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.evaluator;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public interface LogicWritable {
7 | void setDoubleValue(double value);
8 |
9 | void setLongValue(long value);
10 |
11 | void setBooleanValue(boolean value);
12 | }
13 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/messages/MessageConsumer.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.messages;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | import java.util.function.Consumer;
6 |
7 | /// Represents a class capable of accepting and processing messages generated during the compilation.
8 | /// Default convenience methods are provided for generating various kinds of messages.
9 | ///
10 | /// In the test code, the ExpectedMessages implementation provides mechanisms to validate only the expected messages
11 | /// are generated by the compiler.
12 | ///
13 | /// Variables holding instances of this interface should be named "messageConsumer",
14 | /// or "expectedMessages" in the test code.
15 | @FunctionalInterface
16 | @NullMarked
17 | public interface MessageConsumer extends Consumer {
18 |
19 | void addMessage(MindcodeMessage message);
20 |
21 | default void accept(MindcodeMessage message) {
22 | addMessage(message);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/messages/MessageLevel.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.messages;
2 |
3 | import info.teksol.mc.util.StringUtils;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | @NullMarked
7 | public enum MessageLevel {
8 | ERROR,
9 | WARNING,
10 | INFO,
11 | DEBUG;
12 |
13 | private final String title;
14 |
15 | public boolean strongerOrEqual(MessageLevel other) {
16 | return ordinal() >= other.ordinal();
17 | }
18 |
19 | public boolean weakerOrEqual(MessageLevel other) {
20 | return ordinal() >= other.ordinal();
21 | }
22 |
23 | MessageLevel() {
24 | title = StringUtils.titleCase(name());
25 | }
26 |
27 | public String getTitle() {
28 | return title;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/messages/MessageLogger.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.messages;
2 |
3 | import info.teksol.mc.common.SourceElement;
4 | import info.teksol.mc.common.SourcePosition;
5 | import org.intellij.lang.annotations.PrintFormat;
6 | import org.jspecify.annotations.NullMarked;
7 |
8 | @NullMarked
9 | public interface MessageLogger {
10 |
11 | void error(SourceElement node, @PrintFormat String format, Object... args);
12 |
13 | void error(SourcePosition position, @PrintFormat String format, Object... args);
14 |
15 | void error(@PrintFormat String format, Object... args);
16 |
17 | void warn(SourceElement node, @PrintFormat String format, Object... args);
18 |
19 | void warn(SourcePosition position, @PrintFormat String format, Object... args);
20 |
21 | void info(@PrintFormat String format, Object... args);
22 |
23 | void timing(@PrintFormat String format, Object... args);
24 |
25 | void debug(String message);
26 | }
27 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/messages/SourcePositionTranslator.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.messages;
2 |
3 | import info.teksol.mc.common.SourcePosition;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | @NullMarked
7 | public interface SourcePositionTranslator {
8 |
9 | SourcePosition apply(SourcePosition position);
10 | }
11 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/messages/TranslatingMessageConsumer.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.messages;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public class TranslatingMessageConsumer implements MessageConsumer {
7 | private final MessageConsumer consumer;
8 | private final SourcePositionTranslator translator;
9 |
10 | public TranslatingMessageConsumer(MessageConsumer consumer, SourcePositionTranslator translator) {
11 | this.consumer = consumer;
12 | this.translator = translator;
13 | }
14 |
15 | @Override
16 | public void addMessage(MindcodeMessage message) {
17 | consumer.accept(message.translatePosition(translator));
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/CompilationPhase.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public enum CompilationPhase {
7 | LEXER,
8 | PARSER,
9 | AST_BUILDER,
10 | PREPROCESSOR,
11 | CALL_GRAPH,
12 | COMPILER,
13 | OPTIMIZER,
14 | PRINTER,
15 | EMULATOR,
16 | ALL;
17 |
18 | public boolean includes(CompilationPhase phase) {
19 | return this.ordinal() >= phase.ordinal();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/CompilerContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler;
2 |
3 | import info.teksol.mc.messages.MessageConsumer;
4 | import info.teksol.mc.messages.MessageEmitter;
5 | import org.jspecify.annotations.NullMarked;
6 |
7 | /// Represents a context used during compilation.
8 | /// Provides utilities and services needed during the compilation process.
9 | /// Specific interfaces extending this interface are created for specific classes
10 | /// accessing the context, providing only the necessary methods for the class.
11 | ///
12 | /// Where possible, the context is passed as a parameter to the class that needs it.
13 | /// In other cases the context can be accesses via appropriate static method of the
14 | /// `MindcodeCompiler` class.
15 | ///
16 | /// Context interfaces declare getter methods without the `get` prefix, so that
17 | /// a record matching the interface can be easily created for testing.
18 | @NullMarked
19 | public interface CompilerContext extends MessageEmitter {
20 | MessageConsumer messageConsumer();
21 | }
22 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/DataType.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public enum DataType {
7 | // No return type
8 | VOID ("void"),
9 |
10 | // General mlog variable
11 | VAR ("def"),
12 | ;
13 |
14 | public final String keyword;
15 |
16 | DataType(String keyword) {
17 | this.keyword = keyword;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/antlr/MissingSemicolonException.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.antlr;
2 |
3 | import org.antlr.v4.runtime.RecognitionException;
4 | import org.antlr.v4.runtime.Token;
5 | import org.jspecify.annotations.NullMarked;
6 |
7 | @NullMarked
8 | public class MissingSemicolonException extends RecognitionException {
9 | private final Token nextToken;
10 |
11 | public MissingSemicolonException(Token nextToken) {
12 | super(null, null, null);
13 | this.nextToken = nextToken;
14 | }
15 |
16 | public Token getNextToken() {
17 | return nextToken;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/AstBuilderContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast;
2 |
3 | import info.teksol.mc.mindcode.compiler.CompilerContext;
4 | import info.teksol.mc.mindcode.compiler.ast.nodes.AstRequire;
5 | import org.jspecify.annotations.NullMarked;
6 |
7 | @NullMarked
8 | public interface AstBuilderContext extends CompilerContext {
9 | void addRequirement(AstRequire requirement);
10 | }
11 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/ParserAbort.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public class ParserAbort extends RuntimeException {
7 | }
8 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstArray.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 | import org.jspecify.annotations.Nullable;
5 |
6 | @NullMarked
7 | public interface AstArray {
8 |
9 | @Nullable AstIdentifier getProcessor();
10 |
11 | AstIdentifier getArray();
12 | }
13 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstBreakStatement.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.annotations.AstNode;
4 | import info.teksol.mc.common.SourcePosition;
5 | import info.teksol.mc.mindcode.compiler.astcontext.AstContextType;
6 | import org.jspecify.annotations.NullMarked;
7 | import org.jspecify.annotations.Nullable;
8 |
9 | @NullMarked
10 | @AstNode(printFlat = true)
11 | public class AstBreakStatement extends AstLabeledStatement {
12 |
13 | public AstBreakStatement(SourcePosition sourcePosition, @Nullable AstIdentifier loopLabel) {
14 | super(sourcePosition, loopLabel);
15 | }
16 |
17 | @Override
18 | public AstContextType getContextType() {
19 | return AstContextType.BREAK;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstContinueStatement.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.annotations.AstNode;
4 | import info.teksol.mc.common.SourcePosition;
5 | import info.teksol.mc.mindcode.compiler.astcontext.AstContextType;
6 | import org.jspecify.annotations.NullMarked;
7 | import org.jspecify.annotations.Nullable;
8 |
9 | @NullMarked
10 | @AstNode(printFlat = true)
11 | public class AstContinueStatement extends AstLabeledStatement {
12 |
13 | public AstContinueStatement(SourcePosition sourcePosition, @Nullable AstIdentifier loopLabel) {
14 | super(sourcePosition, loopLabel);
15 | }
16 |
17 | @Override
18 | public AstContextType getContextType() {
19 | return AstContextType.CONTINUE;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstDeclaration.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.mc.common.SourcePosition;
4 | import org.jspecify.annotations.NullMarked;
5 | import org.jspecify.annotations.Nullable;
6 |
7 | import java.util.List;
8 |
9 | @NullMarked
10 | public abstract class AstDeclaration extends AstBaseMindcodeNode {
11 |
12 | @Override
13 | public AstNodeScope getScopeRestriction() {
14 | return AstNodeScope.GLOBAL;
15 | }
16 |
17 | @Override
18 | public boolean reportAllScopeErrors() {
19 | return true;
20 | }
21 |
22 | protected AstDeclaration(SourcePosition sourcePosition) {
23 | super(sourcePosition);
24 | }
25 |
26 | protected AstDeclaration(SourcePosition sourcePosition, List children) {
27 | super(sourcePosition, children);
28 | }
29 |
30 | protected AstDeclaration(SourcePosition sourcePosition, List children,
31 | @Nullable AstDocComment docComment) {
32 | super(sourcePosition, children, docComment);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstDocComment.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.annotations.AstNode;
4 | import info.teksol.mc.common.SourcePosition;
5 | import org.jspecify.annotations.NullMarked;
6 | import org.jspecify.annotations.Nullable;
7 |
8 | @NullMarked
9 | @AstNode
10 | public class AstDocComment extends AstDeclaration {
11 | private final String comment;
12 |
13 | public AstDocComment(SourcePosition sourcePosition, String comment) {
14 | super(sourcePosition);
15 | this.comment = comment;
16 | }
17 |
18 | public String getComment() {
19 | return comment;
20 | }
21 |
22 | @Override
23 | public boolean equals(@Nullable Object o) {
24 | if (o == null || getClass() != o.getClass()) return false;
25 |
26 | AstDocComment that = (AstDocComment) o;
27 | return comment.equals(that.comment);
28 | }
29 |
30 | @Override
31 | public int hashCode() {
32 | return comment.hashCode();
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstExpression.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.mc.common.SourcePosition;
4 | import org.jspecify.annotations.NullMarked;
5 | import org.jspecify.annotations.Nullable;
6 |
7 | import java.util.List;
8 |
9 | @NullMarked
10 | public abstract class AstExpression extends AstBaseMindcodeNode {
11 |
12 | @Override
13 | public AstNodeScope getScopeRestriction() {
14 | return AstNodeScope.LOCAL;
15 | }
16 |
17 | protected AstExpression(SourcePosition sourcePosition) {
18 | super(sourcePosition);
19 | }
20 |
21 | protected AstExpression(SourcePosition sourcePosition, List children) {
22 | super(sourcePosition, children);
23 | }
24 |
25 | protected AstExpression(SourcePosition sourcePosition, List children,
26 | @Nullable AstDocComment docComment) {
27 | super(sourcePosition, children, docComment);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstFormattablePlaceholder.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.annotations.AstNode;
4 | import info.teksol.mc.common.SourcePosition;
5 | import org.jspecify.annotations.NullMarked;
6 | import org.jspecify.annotations.Nullable;
7 |
8 | @NullMarked
9 | @AstNode(printFlat = true)
10 | public class AstFormattablePlaceholder extends AstExpression {
11 |
12 | public AstFormattablePlaceholder(SourcePosition sourcePosition) {
13 | super(sourcePosition);
14 | }
15 |
16 | @Override
17 | public boolean equals(@Nullable Object o) {
18 | if (this == o) return true;
19 | return o != null && getClass() == o.getClass();
20 | }
21 |
22 | @Override
23 | public int hashCode() {
24 | return 17;
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstFragment.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.mc.common.SourcePosition;
4 | import org.jspecify.annotations.NullMarked;
5 | import org.jspecify.annotations.Nullable;
6 |
7 | import java.util.List;
8 |
9 | @NullMarked
10 | public abstract class AstFragment extends AstBaseMindcodeNode {
11 |
12 | @Override
13 | public AstNodeScope getScopeRestriction() {
14 | return AstNodeScope.NONE;
15 | }
16 |
17 | protected AstFragment(SourcePosition sourcePosition) {
18 | super(sourcePosition);
19 | }
20 |
21 | protected AstFragment(SourcePosition sourcePosition, List children) {
22 | super(sourcePosition, children);
23 | }
24 |
25 | protected AstFragment(SourcePosition sourcePosition, List children,
26 | @Nullable AstDocComment docComment) {
27 | super(sourcePosition, children, docComment);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstLiteralColor.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.annotations.AstNode;
4 | import info.teksol.mc.common.SourcePosition;
5 | import info.teksol.mc.evaluator.Color;
6 | import org.jspecify.annotations.NullMarked;
7 |
8 | @NullMarked
9 | @AstNode(printFlat = true)
10 | public class AstLiteralColor extends AstLiteralNumeric {
11 |
12 | public AstLiteralColor(SourcePosition sourcePosition, String literal) {
13 | super(sourcePosition, literal, false);
14 | }
15 |
16 | @Override
17 | public double getDoubleValue() {
18 | return Color.parseColor(literal);
19 | }
20 |
21 | @Override
22 | public long getLongValue() {
23 | return (long) getDoubleValue();
24 | }
25 |
26 | @Override
27 | public AstLiteralColor withSourcePosition(SourcePosition sourcePosition) {
28 | return new AstLiteralColor(sourcePosition, literal);
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstLiteralEscape.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.annotations.AstNode;
4 | import info.teksol.mc.common.SourcePosition;
5 | import org.jspecify.annotations.NullMarked;
6 |
7 | @NullMarked
8 | @AstNode(printFlat = true)
9 | public class AstLiteralEscape extends AstLiteralString {
10 |
11 | public AstLiteralEscape(SourcePosition sourcePosition, String literal) {
12 | super(sourcePosition, literal);
13 | }
14 |
15 | @Override
16 | public AstLiteralEscape withSourcePosition(SourcePosition sourcePosition) {
17 | return new AstLiteralEscape(sourcePosition, literal);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstLiteralNumeric.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.mc.common.SourcePosition;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | @NullMarked
7 | public abstract class AstLiteralNumeric extends AstLiteral {
8 |
9 | protected AstLiteralNumeric(SourcePosition sourcePosition, String literal, boolean suppressWarning) {
10 | super(sourcePosition, literal, suppressWarning);
11 | if (literal.isEmpty()) {
12 | throw new IllegalArgumentException("Value cannot be empty");
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstLiteralString.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.annotations.AstNode;
4 | import info.teksol.mc.common.SourcePosition;
5 | import org.jspecify.annotations.NullMarked;
6 |
7 | @NullMarked
8 | @AstNode(printFlat = true)
9 | public class AstLiteralString extends AstLiteral {
10 |
11 | public AstLiteralString(SourcePosition sourcePosition, String literal) {
12 | super(sourcePosition, literal, false);
13 | }
14 |
15 | public String getValue() {
16 | return literal;
17 | }
18 |
19 | @Override
20 | public AstLiteralString withSourcePosition(SourcePosition sourcePosition) {
21 | return new AstLiteralString(sourcePosition, literal);
22 | }
23 |
24 | @Override
25 | public double getDoubleValue() {
26 | return 1.0;
27 | }
28 |
29 | @Override
30 | public long getLongValue() {
31 | return 1;
32 | }
33 | }
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstMlogParameters.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.annotations.AstNode;
4 | import info.teksol.mc.common.SourcePosition;
5 | import org.jspecify.annotations.NullMarked;
6 |
7 | @NullMarked
8 | @AstNode(printFlat = true)
9 | public class AstMlogParameters extends AstFragment {
10 | private final AstExpression mlog;
11 |
12 | public AstMlogParameters(SourcePosition sourcePosition, AstExpression mlog) {
13 | super(sourcePosition, children(mlog));
14 | this.mlog = mlog;
15 | }
16 |
17 | public AstExpression getMlog() {
18 | return mlog;
19 | }
20 |
21 | @Override
22 | public boolean equals(Object o) {
23 | if (o == null || getClass() != o.getClass()) return false;
24 |
25 | AstMlogParameters that = (AstMlogParameters) o;
26 | return mlog.equals(that.mlog);
27 | }
28 |
29 | @Override
30 | public int hashCode() {
31 | return mlog.hashCode();
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstNodeScope.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public enum AstNodeScope {
7 | GLOBAL,
8 | LOCAL,
9 | NONE,
10 | ;
11 |
12 | public boolean disallowed(AstNodeScope currentScope) {
13 | return this != NONE && this != currentScope;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/AstStatement.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import info.teksol.mc.common.SourcePosition;
4 | import org.jspecify.annotations.NullMarked;
5 | import org.jspecify.annotations.Nullable;
6 |
7 | import java.util.List;
8 |
9 | @NullMarked
10 | public abstract class AstStatement extends AstBaseMindcodeNode {
11 |
12 | @Override
13 | public AstNodeScope getScopeRestriction() {
14 | return AstNodeScope.LOCAL;
15 | }
16 |
17 | protected AstStatement(SourcePosition sourcePosition) {
18 | super(sourcePosition);
19 | }
20 |
21 | protected AstStatement(SourcePosition sourcePosition, List children) {
22 | super(sourcePosition, children);
23 | }
24 |
25 | protected AstStatement(SourcePosition sourcePosition, List children,
26 | @Nullable AstDocComment docComment) {
27 | super(sourcePosition, children, docComment);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/ast/nodes/ExternalStorage.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.ast.nodes;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 | import org.jspecify.annotations.Nullable;
5 |
6 | @NullMarked
7 | public interface ExternalStorage extends AstMindcodeNode {
8 |
9 | AstIdentifier getMemory();
10 |
11 | @Nullable AstRange getRange();
12 |
13 | default @Nullable AstExpression getStartIndex() {
14 | return null;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/callgraph/CallGraphCreatorContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.callgraph;
2 |
3 | import info.teksol.mc.mindcode.compiler.CompilerContext;
4 | import info.teksol.mc.mindcode.compiler.generation.variables.NameCreator;
5 | import info.teksol.mc.mindcode.logic.instructions.InstructionProcessor;
6 | import info.teksol.mc.profile.GlobalCompilerProfile;
7 | import org.jspecify.annotations.NullMarked;
8 |
9 | @NullMarked
10 | public interface CallGraphCreatorContext extends CompilerContext {
11 | GlobalCompilerProfile globalCompilerProfile();
12 | InstructionProcessor instructionProcessor();
13 | NameCreator nameCreator();
14 | }
15 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/evaluator/CompileTimeEvaluatorContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.evaluator;
2 |
3 | import info.teksol.mc.mindcode.compiler.CompilerContext;
4 | import info.teksol.mc.mindcode.compiler.callgraph.CallGraph;
5 | import info.teksol.mc.mindcode.compiler.generation.variables.Variables;
6 | import info.teksol.mc.mindcode.logic.instructions.InstructionProcessor;
7 | import info.teksol.mc.profile.GlobalCompilerProfile;
8 | import org.jspecify.annotations.NullMarked;
9 |
10 | @NullMarked
11 | public interface CompileTimeEvaluatorContext extends CompilerContext {
12 | GlobalCompilerProfile globalCompilerProfile();
13 | InstructionProcessor instructionProcessor();
14 | CallGraph callGraph();
15 | Variables variables();
16 | }
17 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/evaluator/ValueType.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.evaluator;
2 |
3 | enum ValueType {NULL, BOOLEAN, BIN, HEX, LONG, DOUBLE}
4 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/functions/FunctionHandler.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.functions;
2 |
3 | import info.teksol.mc.mindcode.compiler.ast.nodes.AstFunctionCall;
4 | import info.teksol.mc.mindcode.compiler.generation.variables.FunctionArgument;
5 | import info.teksol.mc.mindcode.compiler.generation.variables.ValueStore;
6 | import org.jspecify.annotations.NullMarked;
7 |
8 | import java.util.List;
9 |
10 | @NullMarked
11 | interface FunctionHandler extends SampleGenerator {
12 | ValueStore handleFunction(AstFunctionCall call, List arguments);
13 | }
14 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/functions/FunctionMapperContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.functions;
2 |
3 | import info.teksol.mc.mindcode.compiler.CompilerContext;
4 | import info.teksol.mc.mindcode.compiler.generation.CodeAssembler;
5 | import info.teksol.mc.mindcode.logic.instructions.InstructionProcessor;
6 | import org.jspecify.annotations.NullMarked;
7 |
8 | @NullMarked
9 | public interface FunctionMapperContext extends CompilerContext {
10 | InstructionProcessor instructionProcessor();
11 | CodeAssembler assembler();
12 | }
13 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/functions/InvalidMetadataException.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.functions;
2 |
3 | import info.teksol.mc.mindcode.compiler.MindcodeInternalError;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | @NullMarked
7 | public class InvalidMetadataException extends MindcodeInternalError {
8 | InvalidMetadataException(String message) {
9 | super(message);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/functions/PropertyHandler.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.functions;
2 |
3 | import info.teksol.mc.mindcode.compiler.ast.nodes.AstFunctionCall;
4 | import info.teksol.mc.mindcode.compiler.generation.variables.FunctionArgument;
5 | import info.teksol.mc.mindcode.compiler.generation.variables.ValueStore;
6 | import info.teksol.mc.mindcode.logic.arguments.LogicValue;
7 | import org.jspecify.annotations.NullMarked;
8 |
9 | import java.util.List;
10 |
11 | @NullMarked
12 | interface PropertyHandler extends SampleGenerator {
13 | LogicValue handleProperty(AstFunctionCall node, ValueStore target, List arguments);
14 | }
15 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/functions/SelectorFunction.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.functions;
2 |
3 | import info.teksol.mc.mindcode.logic.opcodes.NamedParameter;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | @NullMarked
7 | interface SelectorFunction extends FunctionHandler {
8 | NamedParameter getSelector();
9 | }
10 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/AbstractStandaloneBuilder.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation;
2 |
3 | import info.teksol.mc.mindcode.compiler.ast.nodes.AstMindcodeNode;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | /// A base for a standalone builder class. A new instance is created for each processed node. The class
7 | /// provides all the methods the AbstractBuilder class does, but allows to store state inside the instance.
8 | @NullMarked
9 | public abstract class AbstractStandaloneBuilder extends AbstractBuilder {
10 | protected final T node;
11 |
12 | public AbstractStandaloneBuilder(AbstractBuilder builder, T node) {
13 | super(builder);
14 | this.node = node;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/CodeAssemblerContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation;
2 |
3 | import info.teksol.mc.mindcode.compiler.CompilerContext;
4 | import info.teksol.mc.mindcode.compiler.astcontext.AstContext;
5 | import info.teksol.mc.mindcode.compiler.generation.variables.Variables;
6 | import info.teksol.mc.mindcode.logic.instructions.InstructionProcessor;
7 | import info.teksol.mc.profile.GlobalCompilerProfile;
8 | import org.jspecify.annotations.NullMarked;
9 |
10 | @NullMarked
11 | public interface CodeAssemblerContext extends CompilerContext {
12 | GlobalCompilerProfile globalCompilerProfile();
13 | InstructionProcessor instructionProcessor();
14 | Variables variables();
15 | AstContext rootAstContext();
16 | }
17 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/StackTracker.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation;
2 |
3 | import info.teksol.mc.messages.AbstractMessageEmitter;
4 | import info.teksol.mc.messages.MessageConsumer;
5 | import info.teksol.mc.mindcode.logic.arguments.LogicVariable;
6 | import org.jspecify.annotations.NullMarked;
7 |
8 | import java.util.Objects;
9 |
10 | @NullMarked
11 | public class StackTracker extends AbstractMessageEmitter {
12 | private LogicVariable stackMemory = LogicVariable.INVALID;
13 |
14 | public StackTracker(MessageConsumer messageConsumer) {
15 | super(messageConsumer);
16 | }
17 |
18 | public boolean isValid() {
19 | return stackMemory != LogicVariable.INVALID;
20 | }
21 |
22 | public void setStackMemory(LogicVariable stackMemory) {
23 | this.stackMemory = Objects.requireNonNull(stackMemory);
24 | }
25 |
26 | public LogicVariable getStackMemory() {
27 | return stackMemory;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/variables/FormattableContent.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation.variables;
2 |
3 | import info.teksol.mc.common.SourcePosition;
4 | import info.teksol.mc.messages.ERR;
5 | import info.teksol.mc.mindcode.compiler.ast.nodes.AstExpression;
6 | import org.jspecify.annotations.NullMarked;
7 |
8 | import java.util.List;
9 |
10 | @NullMarked
11 | public class FormattableContent extends CompoundValueStore {
12 | private final List parts;
13 |
14 | public FormattableContent(SourcePosition sourcePosition, List parts) {
15 | super(sourcePosition, ERR.FORMATTABLE_FORBIDDEN);
16 | this.parts = parts;
17 | }
18 |
19 | public List getParts() {
20 | return parts;
21 | }
22 |
23 | @Override
24 | public FormattableContent withSourcePosition(SourcePosition sourcePosition) {
25 | return new FormattableContent(sourcePosition, parts);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/variables/FunctionParameter.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation.variables;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public interface FunctionParameter extends ValueStore {
7 | // Variable name
8 | String getName();
9 |
10 | boolean isInput();
11 |
12 | boolean isOutput();
13 | }
14 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/variables/OptimizerContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation.variables;
2 |
3 | import info.teksol.mc.mindcode.compiler.CompilerContext;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | import java.util.List;
7 |
8 | @NullMarked
9 | public interface OptimizerContext extends CompilerContext {
10 | void addDiagnosticData(Object data);
11 | void addDiagnosticData(Class dataClass, List data);
12 | List getDiagnosticData(Class type);
13 | }
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/variables/ProcessorStorage.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation.variables;
2 |
3 | import info.teksol.mc.mindcode.logic.arguments.LogicVariable;
4 | import org.jspecify.annotations.NullMarked;
5 | import org.jspecify.annotations.Nullable;
6 |
7 | import java.util.Objects;
8 |
9 | @NullMarked
10 | public record ProcessorStorage(@Nullable LogicVariable processor, @Nullable String name) {
11 |
12 | public String getName() {
13 | return Objects.requireNonNull(name);
14 | }
15 |
16 | public boolean hasNameSpecification() {
17 | return name != null;
18 | }
19 |
20 | public LogicVariable getProcessor() {
21 | return Objects.requireNonNull(processor);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/variables/VariableScope.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation.variables;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | /// Defines possible scopes of variable registration.
6 | @NullMarked
7 | public enum VariableScope {
8 | /// The registration is valid within the entire function.
9 | FUNCTION,
10 |
11 | /// The registration is valid within the parent node.
12 | PARENT_NODE,
13 |
14 | /// The registration is valid within the current node only.
15 | NODE,
16 | }
17 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/generation/variables/VariablesContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.generation.variables;
2 |
3 | import info.teksol.mc.mindcode.compiler.CompilerContext;
4 | import info.teksol.mc.mindcode.logic.instructions.InstructionProcessor;
5 | import info.teksol.mc.mindcode.logic.mimex.MindustryMetadata;
6 | import info.teksol.mc.profile.GlobalCompilerProfile;
7 | import org.jspecify.annotations.NullMarked;
8 |
9 | @NullMarked
10 | public interface VariablesContext extends CompilerContext {
11 | GlobalCompilerProfile globalCompilerProfile();
12 | InstructionProcessor instructionProcessor();
13 | NameCreator nameCreator();
14 | MindustryMetadata metadata();
15 | }
16 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/optimization/NullDebugPrinter.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.optimization;
2 |
3 | import info.teksol.mc.mindcode.logic.instructions.LogicInstruction;
4 | import org.jspecify.annotations.NullMarked;
5 | import org.jspecify.annotations.Nullable;
6 |
7 | import java.util.List;
8 | import java.util.function.Consumer;
9 |
10 | @NullMarked
11 | public class NullDebugPrinter implements DebugPrinter {
12 | @Override
13 | public void registerIteration(@Nullable Optimizer optimizer, String title, List program) {
14 | // Do nothing
15 | }
16 |
17 | @Override
18 | public void print(Consumer messageConsumer) {
19 | // Do nothing
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/optimization/OptimizationResult.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.optimization;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public enum OptimizationResult {
7 | /// The optimization was done as planned.
8 | REALIZED,
9 |
10 | /// The optimization proposal is no longer valid.
11 | INVALID,
12 |
13 | /// The optimization is possible, but would be costlier than initially assessed. This can only happen
14 | /// if the code was changed by some other optimizer in the meantime.
15 | OVER_LIMIT
16 | }
17 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/optimization/cases/CaseSwitcherConfigurations.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.optimization.cases;
2 |
3 | import info.teksol.mc.common.SourcePosition;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | @NullMarked
7 | public record CaseSwitcherConfigurations(SourcePosition sourcePosition, int configurationsCount) {
8 | }
9 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/optimization/cases/Partition.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.optimization.cases;
2 |
3 | import info.teksol.mc.mindcode.logic.arguments.LogicLabel;
4 | import org.jspecify.annotations.NullMarked;
5 |
6 | // Note: to is exclusive
7 | @NullMarked
8 | public record Partition(int from, int to, LogicLabel label) {
9 | public int size() {
10 | return to - from;
11 | }
12 |
13 | public boolean follows(Partition other) {
14 | return from == other.to;
15 | }
16 |
17 | public Segment toSegment() {
18 | return new Segment(SegmentType.SINGLE, from, to, label, size(), label, size());
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/optimization/cases/SegmentConfigurationGenerator.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.optimization.cases;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | import java.util.List;
6 | import java.util.Set;
7 |
8 | @NullMarked
9 | public interface SegmentConfigurationGenerator {
10 | List getPartitions();
11 |
12 | Set createSegmentConfigurations();
13 |
14 | int getConfigurationCount();
15 | }
16 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/optimization/cases/SegmentType.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.optimization.cases;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | @NullMarked
6 | public enum SegmentType {
7 | /// A segment containing one distinct value
8 | /// When the distinct value is an `else` value, represents an empty segment
9 | SINGLE,
10 |
11 | // A merged segment containing one predominant value and a few possible exceptions
12 | MIXED,
13 |
14 | /// A segment containing multiple distinct values, produces a jump table
15 | JUMP_TABLE
16 | }
17 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/compiler/preprocess/PreprocessorContext.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.compiler.preprocess;
2 |
3 | import info.teksol.mc.mindcode.compiler.CompilerContext;
4 | import info.teksol.mc.profile.DirectiveProcessor;
5 | import org.jspecify.annotations.NullMarked;
6 |
7 | @NullMarked
8 | public interface PreprocessorContext extends CompilerContext {
9 | DirectiveProcessor directiveProcessor();
10 | }
11 |
--------------------------------------------------------------------------------
/compiler/src/main/java/info/teksol/mc/mindcode/decompiler/ParsedMlog.java:
--------------------------------------------------------------------------------
1 | package info.teksol.mc.mindcode.decompiler;
2 |
3 | import org.jspecify.annotations.NullMarked;
4 |
5 | import java.util.List;
6 | import java.util.Map;
7 |
8 | @NullMarked
9 | public record ParsedMlog(Map labels, List