Beispiel #1
0
        private static void BuildIntegerTypeSymbol(
            SymbolTreeBuilder tree,
            IntegerType integerType,
            DataType stringType)
        {
            var type = new PrimitiveTypeSymbol(integerType);

            tree.Add(type);

            var remainderMethod     = new MethodSymbol(type, "remainder", integerType, Params(integerType), integerType);
            var displayStringMethod = new MethodSymbol(type, "to_display_string", integerType, Params(), stringType);

            tree.Add(remainderMethod);
            tree.Add(displayStringMethod);
        }
Beispiel #2
0
        private void BuildMethodSymbol(IMethodDeclarationSyntax method)
        {
            method.Symbol.BeginFulfilling();
            var declaringClassSymbol    = method.DeclaringClass.Symbol.Result;
            var resolver                = new TypeResolver(method.File, diagnostics);
            var selfParameterType       = ResolveSelfParameterType(method.SelfParameter, method.DeclaringClass);
            var parameterTypes          = ResolveParameterTypes(resolver, method.Parameters, method.DeclaringClass);
            var returnType              = ResolveReturnType(method.ReturnType, resolver);
            var reachabilityAnnotations = BuildReachabilityAnnotations(method);
            var symbol = new MethodSymbol(declaringClassSymbol, method.Name, selfParameterType, parameterTypes, returnType, reachabilityAnnotations);

            method.Symbol.Fulfill(symbol);
            symbolTree.Add(symbol);
            BuildSelParameterSymbol(symbol, method.SelfParameter, selfParameterType);
            BuildParameterSymbols(symbol, method.Parameters, parameterTypes);
            ResolveReachabilityAnnotations(method);
        }
        private NamespaceOrPackageSymbol BuildNamespaceSymbol(
            NamespaceOrPackageSymbol containingSymbol,
            NamespaceName namespaces)
        {
            foreach (var nsName in namespaces.Segments)
            {
                var nsSymbol = treeBuilder.Children(containingSymbol)
                               .OfType <NamespaceSymbol>()
                               .SingleOrDefault(c => c.Name == nsName);
                if (nsSymbol is null)
                {
                    nsSymbol = new NamespaceSymbol(containingSymbol, nsName);
                    treeBuilder.Add(nsSymbol);
                }

                containingSymbol = nsSymbol;
            }

            return(containingSymbol);
        }
        private static FixedSymbolTree DefineIntrinsicSymbols()
        {
            var intrinsicsPackage = new PackageSymbol("intrinsics");
            var tree = new SymbolTreeBuilder(intrinsicsPackage);

            var intrinsicsNamespace = new NamespaceSymbol(intrinsicsPackage, "intrinsics");

            // params: length
            var memAllocate = new FunctionSymbol(intrinsicsNamespace, "mem_allocate", Params(DataType.Size), DataType.Size);

            tree.Add(memAllocate);

            // params: ptr
            var memDeallocate = new FunctionSymbol(intrinsicsNamespace, "mem_deallocate", Params(DataType.Size));

            tree.Add(memDeallocate);

            // params: from_ptr, to_ptr, length
            var memCopy = new FunctionSymbol(intrinsicsNamespace, "mem_copy", Params(DataType.Size, DataType.Size, DataType.Size));

            tree.Add(memCopy);

            // params: from_ptr, value
            var memSetByte = new FunctionSymbol(intrinsicsNamespace, "mem_set_byte", Params(DataType.Size, DataType.Byte));

            tree.Add(memSetByte);

            // params: ptr
            var memGetByte = new FunctionSymbol(intrinsicsNamespace, "mem_get_byte", Params(DataType.Size), DataType.Byte);

            tree.Add(memGetByte);

            // params: ptr, length
            var printUtf8 = new FunctionSymbol(intrinsicsNamespace, "print_utf8", Params(DataType.Size, DataType.Size));

            tree.Add(printUtf8);

            // params: ptr, length
            var readUtf8Line = new FunctionSymbol(intrinsicsNamespace, "read_utf8_line", Params(DataType.Size, DataType.Size), DataType.Size);

            tree.Add(readUtf8Line);

            return(tree.Build());
        }
Beispiel #5
0
        private static void BuildEmptyType(SymbolTreeBuilder tree, EmptyType emptyType)
        {
            var symbol = new PrimitiveTypeSymbol(emptyType);

            tree.Add(symbol);
        }
Beispiel #6
0
        private static void BuildBoolSymbol(SymbolTreeBuilder tree)
        {
            var symbol = new PrimitiveTypeSymbol(DataType.Bool);

            tree.Add(symbol);
        }