コード例 #1
0
ファイル: SsaConverterBenchmarks.cs プロジェクト: polsys/cle
        private CompiledMethod ParseAndCompileSingleMethod(string source)
        {
            var sourceBytes = Encoding.UTF8.GetBytes(source);
            var diagnostics = new BenchmarkDiagnosticsSink();

            // Parse the source
            const string sourceFilename = "test.cle";
            var          syntaxTree     = SyntaxParser.Parse(sourceBytes.AsMemory(), sourceFilename, diagnostics);

            if (syntaxTree is null || syntaxTree.Functions.Count != 1)
            {
                throw new InvalidOperationException("Expected a single method");
            }

            // Compile the declaration
            var declarationProvider = new NullDeclarationProvider();
            var declaration         = MethodDeclarationCompiler.Compile(syntaxTree.Functions[0],
                                                                        syntaxTree.Namespace, sourceFilename,
                                                                        0, declarationProvider, diagnostics);

            // Compile the method body
            var result = new MethodCompiler(declarationProvider, diagnostics)
                         .CompileBody(syntaxTree.Functions[0], declaration !, syntaxTree.Namespace, sourceFilename);

            if (diagnostics.DiagnosticCount > 0)
            {
                throw new InvalidOperationException("Expected no diagnostics");
            }
            return(result !);
        }
コード例 #2
0
        public void Compile_parameterless_int32_method_succeeds()
        {
            var position            = new TextPosition(280, 14, 8);
            var syntax              = MakeParameterlessMethod(Visibility.Private, "int32", position);
            var diagnostics         = new TestingDiagnosticSink();
            var declarationProvider = new TestingSingleFileDeclarationProvider();

            var result = MethodDeclarationCompiler.Compile(syntax, "long::ns", "int32.cle", 8, declarationProvider, diagnostics);

            Assert.That(diagnostics.Diagnostics, Is.Empty);
            Assert.That(result, Is.InstanceOf <NativeMethodDeclaration>());
            Assert.That((result as NativeMethodDeclaration) !.IsEntryPoint, Is.False);
            Assert.That(result !.ReturnType, Is.EqualTo(SimpleType.Int32));
            Assert.That(result.Visibility, Is.EqualTo(Visibility.Private));
            Assert.That(result.FullName, Is.EqualTo("long::ns::MethodName"));
            Assert.That(result.DefiningFilename, Is.EqualTo("int32.cle"));
            Assert.That(result.DefinitionPosition, Is.EqualTo(position));
            Assert.That(result.BodyIndex, Is.EqualTo(8));
        }
コード例 #3
0
        public void Compile_parameterless_bool_method_succeeds()
        {
            var position            = new TextPosition(13, 3, 4);
            var syntax              = MakeParameterlessMethod(Visibility.Public, "bool", position);
            var diagnostics         = new TestingDiagnosticSink();
            var declarationProvider = new TestingSingleFileDeclarationProvider();

            var result = MethodDeclarationCompiler.Compile(syntax, "Namespace", "bool.cle", 7, declarationProvider, diagnostics);

            Assert.That(diagnostics.Diagnostics, Is.Empty);
            Assert.That(result, Is.InstanceOf <NativeMethodDeclaration>());
            Assert.That((result as NativeMethodDeclaration) !.IsEntryPoint, Is.False);
            Assert.That(result !.ReturnType, Is.EqualTo(SimpleType.Bool));
            Assert.That(result.Visibility, Is.EqualTo(Visibility.Public));
            Assert.That(result.FullName, Is.EqualTo("Namespace::MethodName"));
            Assert.That(result.DefiningFilename, Is.EqualTo("bool.cle"));
            Assert.That(result.DefinitionPosition, Is.EqualTo(position));
            Assert.That(result.BodyIndex, Is.EqualTo(7));
        }
コード例 #4
0
ファイル: MethodCompilerTestBase.cs プロジェクト: polsys/cle
        /// <summary>
        /// Parses the given source code, compiles the method declarations and
        /// returns the result of <see cref="MethodCompiler.CompileBody"/> on the first method.
        /// </summary>
        protected CompiledMethod?TryCompileFirstMethod(string source,
                                                       out TestingDiagnosticSink diagnostics)
        {
            var sourceBytes = Encoding.UTF8.GetBytes(source);

            diagnostics = new TestingDiagnosticSink();

            // Parse the source
            const string sourceFilename = "test.cle";
            var          syntaxTree     = SyntaxParser.Parse(sourceBytes.AsMemory(), sourceFilename, diagnostics);

            Assert.That(syntaxTree, Is.Not.Null, "Source file was not parsed successfully.");

            // Parse the declarations
            var declarationProvider            = new TestingSingleFileDeclarationProvider();
            MethodDeclaration?firstDeclaration = null;

            foreach (var functionSyntax in syntaxTree !.Functions)
            {
                var declaration = MethodDeclarationCompiler.Compile(functionSyntax, syntaxTree.Namespace, sourceFilename,
                                                                    declarationProvider.Methods.Count, declarationProvider, diagnostics);
                Assert.That(declaration, Is.Not.Null,
                            $"Method declaration for {functionSyntax.Name} was not compiled successfully.");

                if (firstDeclaration is null)
                {
                    firstDeclaration = declaration;
                }
                declarationProvider.Methods.Add(functionSyntax.Name, declaration !);
            }

            Assert.That(firstDeclaration, Is.Not.Null, "No methods were declared.");

            // Then compile the first method
            return(new MethodCompiler(declarationProvider, diagnostics)
                   .CompileBody(syntaxTree.Functions[0], firstDeclaration !, syntaxTree.Namespace, sourceFilename));
        }
コード例 #5
0
        public void ProcessBeforeInterior(ITreeNode element)
        {
            //myCurrentState = new ElementProcessingState(myCurrentState);
            ElementCompiler currentNodeCompiler;

            switch (element)
            {
            // TODO : Ternary operator
//                case IDelegateDeclaration delegateDeclaration:
//                    currentNodeCompiler = new DelegateDeclarationCompiler(delegateDeclaration, @params);
//                    break;
            case  IArrowExpressionClause arrowExpressionClause:
                currentNodeCompiler = new ArrowExpressionClauseCompiler(arrowExpressionClause, @params);
                break;

            case IReferenceName referenceName:
                currentNodeCompiler = new ReferenceNameCompiler(referenceName, @params);
                break;

            case IBaseExpression baseExpression:
                currentNodeCompiler = new BaseExpressionCompiler(baseExpression, @params);
                break;

            case IEventDeclaration eventDeclaration:
                currentNodeCompiler = new EventDeclarationCompiler(eventDeclaration, @params);
                break;

            case IConstantDeclaration constantDeclaration:
                currentNodeCompiler = new ConstantDeclarationCompiler(constantDeclaration, @params);
                break;

            case IIndexerDeclaration indexerDeclaration:
                currentNodeCompiler = new IndexerDeclarationCompiler(indexerDeclaration, @params);
                break;

            case IElementAccessExpression elementAccessExpression:
                currentNodeCompiler = new ElementAccessCompiler(elementAccessExpression, @params);
                break;

            case IAccessorDeclaration accessor:
                currentNodeCompiler = new AccessorDeclarationCompiler(accessor, @params);
                break;

            case IFieldDeclaration fieldDeclaration:
                currentNodeCompiler = new ClassFieldDeclarationCompiler(fieldDeclaration, @params);
                break;

            case IPropertyDeclaration propertyDeclaration:
                currentNodeCompiler = new PropertyDeclarationCompiler(propertyDeclaration, @params);
                break;

            case IEnumDeclaration enumDeclaration:
                currentNodeCompiler = new EnumDeclarationCompiler(enumDeclaration, @params);
                break;

            case IAssignmentExpression assignmentExpression:
                currentNodeCompiler = new AssignmentExpressionCompiler(assignmentExpression, @params);
                break;

            case ILocalFunctionDeclaration localFunctionDeclaration:
                currentNodeCompiler = new LocalFunctionDeclarationCompiler(localFunctionDeclaration, @params);
                break;

            case IAnonymousFunctionExpression anonymousFunctionExpression:
                currentNodeCompiler = new AnonymousFunctionCompiler(anonymousFunctionExpression, @params);
                break;

            case IObjectCreationExpression objectCreationExpression:
                currentNodeCompiler = new ObjectCreationExpressionCompiler(objectCreationExpression, @params);
                break;

            case ILocalVariableDeclaration localVariableDeclaration:
                currentNodeCompiler = new LocalVariableDeclarationCompiler(localVariableDeclaration, @params);
                break;

            case IVariableDeclaration variableDeclaration:
                currentNodeCompiler = new VariableDeclarationCompiler(variableDeclaration, @params);
                break;

            case IArgumentList argumentList:
                currentNodeCompiler = new ArgumentListCompiler(argumentList, @params);
                break;

            case IInvocationExpression invocationExpression:
                currentNodeCompiler = new InvocationExpressionCompiler(invocationExpression, @params);
                break;

            case IMethodDeclaration methodDeclaration:
                currentNodeCompiler = new MethodDeclarationCompiler(methodDeclaration, @params);
                break;

            case IConstructorDeclaration constructorDeclaration:
                currentNodeCompiler = new ConstructorDeclarationCompiler(constructorDeclaration, @params);
                break;

            case IIfStatement ifStatement:
                currentNodeCompiler = new IfStatementCompiler(ifStatement, @params);
                break;

            case ISwitchBlock switchBlock:
                currentNodeCompiler = new SwitchBlockCompiler(switchBlock, @params);
                break;

            case IReturnStatement returnStatement:
                currentNodeCompiler = new ReturnStatementCompiler(returnStatement, @params);
                break;

            case IClassLikeDeclaration classLikeDeclaration:
                currentNodeCompiler = new ClassLikeDeclarationCompiler(classLikeDeclaration, @params);
                break;

            case IReferenceExpression referenceExpression:
                currentNodeCompiler = new ReferenceExpressionCompiler(referenceExpression, @params);
                break;

            case IThisExpression thisExpression:
                currentNodeCompiler = new ThisExpressionCompiler(thisExpression, @params);
                break;

            default:
                currentNodeCompiler = new ExpressionCompiler(@params);
                break;
//                case ICSharpExpression expression:
//                    currentNodeCompiler = new ExpressionCompiler(@params);
//                    break;
//                default:
//                    currentNodeCompiler = new ElementCompiler(@params);
//                    break;
            }

            currentNodeCompiler.Parent = myCurrentNodeCompiler;
            myCurrentNodeCompiler      = currentNodeCompiler;
        }