public static Core.Type ResolveStruct( Core.Session session, Grammar.ASTNodeExprName nameNode, IList <Core.UseDirective> useDirectives, bool mustBeResolved) { var nameConcreteNode = nameNode as Grammar.ASTNodeExprNameConcrete; if (nameConcreteNode == null) { if (mustBeResolved) { session.AddMessage( Diagnostics.MessageKind.Error, Diagnostics.MessageCode.Expected, "type must be known", nameNode.GetSpan()); } return(new Core.TypeError()); } return(ResolveStruct(session, nameConcreteNode.name, useDirectives, mustBeResolved)); }
private void ResolveExprName(Grammar.ASTNodeExprName exprName, ref int curSegment, Core.DataAccess output) { var name = NameResolver.Resolve(((Grammar.ASTNodeExprNameConcrete)exprName).name); // Try to find a local with the same name. var bindingIndex = FindLocalBinding(name); if (bindingIndex >= 0) { funct.AddInstruction(curSegment, Core.InstructionMoveData.Of( exprName.GetSpan(), output, Core.DataAccessRegister.ForRegister( exprName.GetSpan(), funct.localBindings[bindingIndex].registerIndex))); return; } // Try to find a group of functs with the same name. var functList = session.GetDeclsWithUseDirectives(name, false, useDirectives); if (session.ValidateSingleDecl(functList, name, exprName.GetSpan()) && session.ValidateAsFunct(functList[0], name, exprName.GetSpan())) { funct.AddInstruction(curSegment, Core.InstructionMoveLiteralFunct.With(exprName.GetSpan(), output, functList[0].index)); return; } this.foundErrors = true; session.AddMessage( Diagnostics.MessageKind.Error, Diagnostics.MessageCode.Unknown, "unknown '" + name.GetString() + "'", exprName.GetSpan()); throw new Core.CheckException(); }