private static void ResolveNode(Context ctx, diagn.Reporter reporter, mod.Unit unit, syn.Node node)
        {
            TryCollectFunctionDef(ctx, reporter, unit, node as syn.Node.FunctionDef);

            foreach (var child in node.Children())
            {
                ResolveNode(ctx, reporter, unit, child);
            }
        }
Example #2
0
        private static void ResolveNode(Context ctx, diagn.Reporter reporter, mod.Unit unit, syn.Node node)
        {
            TryResolveIdentifier(ctx, reporter, unit, node as syn.Node.Identifier);

            foreach (var child in node.Children())
            {
                ResolveNode(ctx, reporter, unit, child);
            }
        }
        private static void TryCollectFunctionDef(Context ctx, diagn.Reporter reporter, mod.Unit unit, syn.Node.FunctionDef node)
        {
            if (node == null)
            {
                return;
            }

            var hDef = unit.semanticMap.def[node];

            if (hDef == null)
            {
                reporter.InternalError("def not found for node", new diagn.Caret(node.span));
            }

            else
            {
                var functionDef = ctx[hDef] as sema.Def.Function;
                functionDef.body = new sema.Code.Body();

                if (node.returnType == null)
                {
                    functionDef.body.registers.Add(new sema.Code.Register
                    {
                        type = new sema.Type.Tuple()
                    });
                }
                else
                {
                    functionDef.body.registers.Add(new sema.Code.Register
                    {
                        spanDef = node.returnType.span,
                        type    = TypeResolver.Resolve(ctx, reporter, node.returnType)
                    });
                }

                foreach (var child in node.parameters)
                {
                    var nodeParameter  = child as syn.Node.FunctionDefParameter;
                    var nodeIdentifier = nodeParameter.identifier as syn.Node.Identifier;

                    var parameterName = nodeIdentifier.token.excerpt;
                    var parameterType = TypeResolver.Resolve(ctx, reporter, nodeParameter.type);

                    functionDef.body.parameterCount++;
                    functionDef.body.registers.Add(new sema.Code.Register
                    {
                        spanDef     = nodeParameter.span,
                        spanDefName = nodeIdentifier.span,
                        name        = parameterName,
                        type        = parameterType
                    });
                }
            }
        }
Example #4
0
        private static void TryCollectFunctionDef(Context ctx, diagn.Reporter reporter, mod.Unit unit, syn.Node.FunctionDef node)
        {
            if (node == null)
            {
                return;
            }

            var hDef = ctx.defs.Reserve();

            ctx[hDef]                  = new sema.Def.Function();
            ctx[hDef].spanDef          = node.span;
            unit.semanticMap.def[node] = hDef;

            if (node.name != null)
            {
                var identifierToken = (node.name as syn.Node.Identifier).token;
                ctx[hDef].spanDefName = identifierToken.span;

                var namespaceNode = ctx.names.FindOrReserve(identifierToken.excerpt);
                if (namespaceNode.item != null)
                {
                    ReportDuplicate(ctx, reporter, identifierToken.span, namespaceNode);
                }

                else
                {
                    namespaceNode.item = new sema.Namespace.Item.Def {
                        def = hDef
                    };
                    ctx[hDef].namespaceNode                = namespaceNode;
                    unit.semanticMap.references[node]      = namespaceNode;
                    unit.semanticMap.references[node.name] = namespaceNode;
                }
            }
        }
Example #5
0
        private static void TryCollectFunctionDef(Context ctx, diagn.Reporter reporter, mod.Unit unit, syn.Node.FunctionDef node)
        {
            if (node == null)
            {
                return;
            }

            var hDef = unit.semanticMap.def[node];

            if (hDef == null)
            {
                reporter.InternalError("def not found for node", new diagn.Caret(node.span));
            }

            else
            {
                var functionDef = ctx[hDef] as sema.Def.Function;
                CodeResolver.ResolveFunctionBody(ctx, reporter, functionDef.body, node.body);
            }
        }
Example #6
0
        private static void TryCollectStructureDef(Context ctx, diagn.Reporter reporter, mod.Unit unit, syn.Node.StructureDef node)
        {
            if (node == null)
            {
                return;
            }

            var hDef = unit.semanticMap.def[node];

            if (hDef == null)
            {
                reporter.InternalError("def not found for node", new diagn.Caret(node.span));
            }

            else
            {
                var structureDef = ctx[hDef] as sema.Def.Structure;

                foreach (var child in node.fields)
                {
                    var nodeField      = child as syn.Node.StructureDefField;
                    var nodeIdentifier = nodeField.identifier as syn.Node.Identifier;

                    var fieldName      = nodeIdentifier.token.excerpt;
                    var duplicateField = structureDef.fields.Find(f => f.name == fieldName);
                    if (duplicateField != null)
                    {
                        reporter.Error("duplicate field `" + fieldName + "`",
                                       new diagn.Caret(duplicateField.spanDefName, false),
                                       new diagn.Caret(nodeIdentifier.span));
                    }

                    var fieldType = TypeResolver.Resolve(ctx, reporter, nodeField.type);

                    structureDef.fields.Add(new sema.Def.Structure.Field
                    {
                        spanDef     = nodeField.span,
                        spanDefName = nodeIdentifier.span,
                        name        = fieldName,
                        type        = fieldType
                    });
                }
            }
        }
Example #7
0
        private static void TryResolveIdentifier(Context ctx, diagn.Reporter reporter, mod.Unit unit, syn.Node.Identifier node)
        {
            if (node == null)
            {
                return;
            }

            if (unit.semanticMap.references.ContainsKey(node))
            {
                return;
            }

            var identifier     = node.token.excerpt;
            var hNamespaceNode = ctx.names.Find(identifier);

            if (hNamespaceNode != null)
            {
                unit.semanticMap.references[node] = hNamespaceNode;
            }
        }