public bool HasChildFunctions(Genero4glAst ast) { if (Children.Count == 1) { var node = Children[Children.Keys[0]]; if (node is ArrayTypeReference) { return(true); } else if (node is RecordDefinitionNode) { return((node as RecordDefinitionNode).HasChildFunctions(ast)); } } else { if (!string.IsNullOrWhiteSpace(_typeNameString)) { if (_typeNameString.Equals("string", StringComparison.OrdinalIgnoreCase)) { return(true); } else { // try to determine if the _typeNameString is a user defined type IAnalysisResult udt = ast.TryGetUserDefinedType(_typeNameString, LocationIndex); if (udt != null) { return(udt.HasChildFunctions(ast)); } // check for package class IGeneroProject dummyProj; IProjectEntry projEntry; bool dummyDef; udt = ast.GetValueByIndex(_typeNameString, LocationIndex, ast._functionProvider, ast._databaseProvider, ast._programFileProvider, false, out dummyDef, out dummyProj, out projEntry); if (udt != null) { return(udt.HasChildFunctions(ast)); } } } } return(false); }
public IEnumerable <MemberResult> GetMembers(Genero4glAst ast, MemberType memberType, bool function) { bool dummyDef; List <MemberResult> members = new List <MemberResult>(); if (Children.Count == 1) { // we have an array type or a record type definition var node = Children[Children.Keys[0]]; if (node is ArrayTypeReference) { return((node as ArrayTypeReference).GetMembersInternal(ast, memberType, function)); } else if (node is RecordDefinitionNode) { return((node as RecordDefinitionNode).GetMembers(ast, memberType, function)); } } else { if (!string.IsNullOrWhiteSpace(TableName)) { // TODO: return the table's columns } else if (_typeNameString.Equals("string", StringComparison.OrdinalIgnoreCase)) { return(Genero4glAst.StringFunctions.Values.Select(x => new MemberResult(x.Name, x, GeneroMemberType.Method, ast))); } else if (_typeNameString.Equals("text", StringComparison.OrdinalIgnoreCase)) { return(Genero4glAst.TextFunctions.Values.Select(x => new MemberResult(x.Name, x, GeneroMemberType.Method, ast))); } else if (_typeNameString.Equals("byte", StringComparison.OrdinalIgnoreCase)) { return(Genero4glAst.ByteFunctions.Values.Select(x => new MemberResult(x.Name, x, GeneroMemberType.Method, ast))); } else { // try to determine if the _typeNameString is a user defined type (or package class), in which case we need to call its GetMembers function IAnalysisResult udt = ast.TryGetUserDefinedType(_typeNameString, LocationIndex); if (udt != null) { return(udt.GetMembers(ast, memberType, function)); } foreach (var includedFile in ast.ProjectEntry.GetIncludedFiles()) { if (includedFile.Analysis != null) { IGeneroProject dummyProj; IProjectEntry dummyProjEntry; var res = includedFile.Analysis.GetValueByIndex(_typeNameString, 1, null, null, null, false, out dummyDef, out dummyProj, out dummyProjEntry); if (res != null) { return(res.GetMembers(ast, memberType, function)); } } } if (ast.ProjectEntry.ParentProject.ReferencedProjects.Count > 0) { foreach (var refProj in ast.ProjectEntry.ParentProject.ReferencedProjects.Values) { if (refProj is GeneroProject) { IProjectEntry dummyProj; udt = (refProj as GeneroProject).GetMemberOfType(_typeNameString, ast, false, true, false, false, out dummyProj); if (udt != null) { return(udt.GetMembers(ast, memberType, function)); } } } } // check for package class IGeneroProject dummyProject; IProjectEntry projEntry; udt = ast.GetValueByIndex(_typeNameString, LocationIndex, ast._functionProvider, ast._databaseProvider, ast._programFileProvider, false, out dummyDef, out dummyProject, out projEntry); if (udt != null) { return(udt.GetMembers(ast, memberType, function)); } } } return(members); }