public override IEnumerable<MemberReference> FindReferences (ProjectDom dom, FilePath fileName, IEnumerable<INode> searchedMembers) { var editor = TextFileProvider.Instance.GetTextEditorData (fileName); AspNetAppProject project = dom.Project as AspNetAppProject; if (project == null) yield break; var unit = AspNetParserService.GetCompileUnit (project, fileName, true); if (unit == null) yield break; var refman = new DocumentReferenceManager (project); var parsedAspDocument = (AspNetParsedDocument)new AspNetParser ().Parse (dom, fileName, editor.Text); refman.Doc = parsedAspDocument; var usings = refman.GetUsings (); var documentInfo = new DocumentInfo (dom, unit, usings, refman.GetDoms ()); var builder = new AspLanguageBuilder (); var buildDocument = new Mono.TextEditor.Document (); var offsetInfos = new List<LocalDocumentInfo.OffsetInfo> (); buildDocument.Text = builder.BuildDocumentString (documentInfo, editor, offsetInfos, true); var parsedDocument = AspLanguageBuilder.Parse (dom, fileName, buildDocument.Text); foreach (var member in searchedMembers) { foreach (var reference in SearchMember (member, dom, fileName, editor, buildDocument, offsetInfos, parsedDocument)) { yield return reference; } } }
public MemberListVisitor(AspNetParsedDocument doc, DocumentReferenceManager refMan) { this.doc = doc; this.refMan = refMan; this.Errors = new List <Error> (); this.Members = new Dictionary <string, CodeBehindMember> (); }
public MemberListVisitor (AspNetParsedDocument doc, DocumentReferenceManager refMan) { this.doc = doc; this.refMan = refMan; this.Errors = new List<Error> (); this.Members = new Dictionary<string,CodeBehindMember> (); }
public MemberListBuilder(DocumentReferenceManager refMan, XDocument xDoc) { docRefMan = refMan; xDocument = xDoc; Errors = new List <Error> (); Members = new Dictionary <string, CodeBehindMember> (); }
public MemberListBuilder (DocumentReferenceManager refMan, XDocument xDoc) { docRefMan = refMan; xDocument = xDoc; Errors = new List<Error> (); Members = new Dictionary<string,CodeBehindMember> (); }
public override IEnumerable<MemberReference> FindReferences (ProjectDom dom, FilePath fileName, INode member) { var editor = TextFileProvider.Instance.GetTextEditorData (fileName); AspNetAppProject project = dom.Project as AspNetAppProject; System.Console.WriteLine ("project:" + project); if (project == null) yield break; var unit = AspNetParserService.GetCompileUnit (project, fileName, true); System.Console.WriteLine ("unit:" + unit); if (unit == null) yield break; System.Console.WriteLine ("go "); var refman = new DocumentReferenceManager (project); var parsedAspDocument = (AspNetParsedDocument)new AspNetParser ().Parse (dom, fileName, editor.Text); refman.Doc = parsedAspDocument; var usings = refman.GetUsings (); var documentInfo = new DocumentInfo (unit, usings, refman.GetDoms ()); var builder = new AspLanguageBuilder (); var buildDocument = new Mono.TextEditor.Document (); var offsetInfos = new List<LocalDocumentInfo.OffsetInfo> (); buildDocument.Text = builder.BuildDocumentString (documentInfo, editor, offsetInfos, true); var parsedDocument = AspLanguageBuilder.Parse (fileName, buildDocument.Text); var resolver = new NRefactoryResolver (dom, parsedDocument.CompilationUnit, ICSharpCode.NRefactory.SupportedLanguage.CSharp, editor, fileName); FindMemberAstVisitor visitor = new FindMemberAstVisitor (buildDocument, resolver, member); visitor.IncludeXmlDocumentation = IncludeDocumentation; visitor.RunVisitor (); foreach (var result in visitor.FoundReferences) { var offsetInfo = offsetInfos.FirstOrDefault (info => info.ToOffset <= result.Position && result.Position < info.ToOffset + info.Length); if (offsetInfo == null) continue; var offset = offsetInfo.FromOffset + result.Position - offsetInfo.ToOffset; var loc = editor.OffsetToLocation (offset); yield return new MemberReference (null, fileName, offset, loc.Line, loc.Column, result.Name, null); } }
public static System.CodeDom.CodeCompileUnit GenerateCodeBehind (AspNetAppProject project, string filename, AspNetParsedDocument document, List<CodeBehindWarning> errors) { string className = document.Info.InheritedClass; if (document.HasErrors) { AddFail (errors, document, document.Errors.Where (x => x.ErrorType == ErrorType.Error).First ()); return null; } if (string.IsNullOrEmpty (className)) return null; var refman = new DocumentReferenceManager (project) { Doc = document }; var memberList = new MemberListVisitor (document, refman); document.RootNode.AcceptVisit (memberList); var err = memberList.Errors.Where (x => x.ErrorType == ErrorType.Error).FirstOrDefault (); if (err != null) { AddFail (errors, document, err); return null; } //initialise the generated type var ccu = new CodeCompileUnit (); var namespac = new CodeNamespace (); ccu.Namespaces.Add (namespac); var typeDecl = new System.CodeDom.CodeTypeDeclaration () { IsClass = true, IsPartial = true, }; namespac.Types.Add (typeDecl); //name the class and namespace int namespaceSplit = className.LastIndexOf ('.'); string namespaceName = null; if (namespaceSplit > -1) { namespac.Name = project.StripImplicitNamespace (className.Substring (0, namespaceSplit)); typeDecl.Name = className.Substring (namespaceSplit + 1); } else { typeDecl.Name = className; } string masterTypeName = null; if (!String.IsNullOrEmpty (document.Info.MasterPageTypeName)) { masterTypeName = document.Info.MasterPageTypeName; } else if (!String.IsNullOrEmpty (document.Info.MasterPageTypeVPath)) { try { ProjectFile resolvedMaster = project.ResolveVirtualPath (document.Info.MasterPageTypeVPath, document.FileName); AspNetParsedDocument masterParsedDocument = null; if (resolvedMaster != null) masterParsedDocument = ProjectDomService.Parse (project, resolvedMaster.FilePath, null) as AspNetParsedDocument; if (masterParsedDocument != null && !String.IsNullOrEmpty (masterParsedDocument.Info.InheritedClass)) { masterTypeName = masterParsedDocument.Info.InheritedClass; } else { errors.Add (new CodeBehindWarning (String.Format ("Could not find type for master '{0}'", document.Info.MasterPageTypeVPath), document.FileName)); } } catch (Exception ex) { errors.Add (new CodeBehindWarning (String.Format ("Could not find type for master '{0}'", document.Info.MasterPageTypeVPath), document.FileName)); LoggingService.LogWarning ("Error resolving master page type", ex); } } if (masterTypeName != null) { var masterProp = new CodeMemberProperty () { Name = "Master", Type = new CodeTypeReference (masterTypeName), HasGet = true, HasSet = false, Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.New | System.CodeDom.MemberAttributes.Final, }; masterProp.GetStatements.Add (new System.CodeDom.CodeMethodReturnStatement ( new System.CodeDom.CodeCastExpression (masterTypeName, new System.CodeDom.CodePropertyReferenceExpression ( new System.CodeDom.CodeBaseReferenceExpression (), "Master")))); typeDecl.Members.Add (masterProp); } //shortcut building the existing members type map if (memberList.Members.Count == 0) return ccu; var dom = refman.TypeCtx.ProjectDom; var cls = dom.GetType (className); var members = GetDesignerMembers (memberList.Members.Values, cls, filename, dom, dom); //add fields for each control in the page foreach (var member in members) { var type = new CodeTypeReference (member.Type.FullName); typeDecl.Members.Add (new CodeMemberField (type, member.Name) { Attributes = MemberAttributes.Family }); } return ccu; }
string GetTextWithDirective (MonoDevelop.Ide.Gui.Document document, bool insertDirective) { string tag = Text; if (!tag.Contains ("{0}")) return tag; if (base.Type.AssemblyName.StartsWith ("System.Web.UI.WebControls")) return string.Format (tag, "asp"); //register the assembly and look up the class //FIXME: only do this on the insert, not the preview - or remove it afterwards RegisterReference (document.Project); var database = MonoDevelop.Projects.Dom.Parser.ProjectDomService.GetProjectDom (document.Project); var cls = database.GetType (Type.TypeName); if (cls == null) return tag; var doc = document.ParsedDocument as MonoDevelop.AspNet.Parser.AspNetParsedDocument; if (doc == null) return tag; var assemName = SystemAssemblyService.ParseAssemblyName (Type.AssemblyName); var refMan = new DocumentReferenceManager ((AspNetAppProject)document.Project) { Doc = doc, }; RegisterDirective directive; string prefix = refMan.GetTagPrefixWithNewDirective (cls, assemName.Name, null, out directive); if (prefix == null) return tag; tag = string.Format (tag, prefix); if (directive != null && insertDirective) refMan.AddRegisterDirective (directive, document.Editor, true); return tag; }
public static BuildResult GenerateCodeBehind ( AspNetAppProject project, string filename, AspNetParsedDocument document, out CodeCompileUnit ccu) { ccu = null; var result = new BuildResult (); string className = document.Info.InheritedClass; foreach (var err in document.Errors) result.AddError (filename, err.Region.BeginLine, err.Region.BeginColumn, null, err.Message); if (result.ErrorCount > 0) return result; if (string.IsNullOrEmpty (className)) return result; var refman = new DocumentReferenceManager (project) { Doc = document }; var memberList = new MemberListBuilder (refman, document.XDocument); memberList.Build (); foreach (var err in memberList.Errors) result.AddError (filename, err.Region.BeginLine, err.Region.BeginColumn, null, err.Message); if (result.ErrorCount > 0) return result; //initialise the generated type ccu = new CodeCompileUnit (); var namespac = new CodeNamespace (); ccu.Namespaces.Add (namespac); var typeDecl = new CodeTypeDeclaration { IsClass = true, IsPartial = true, }; namespac.Types.Add (typeDecl); //name the class and namespace int namespaceSplit = className.LastIndexOf ('.'); if (namespaceSplit > -1) { namespac.Name = project.StripImplicitNamespace (className.Substring (0, namespaceSplit)); typeDecl.Name = className.Substring (namespaceSplit + 1); } else { typeDecl.Name = className; } string masterTypeName = null; if (!String.IsNullOrEmpty (document.Info.MasterPageTypeName)) { masterTypeName = document.Info.MasterPageTypeName; } else if (!String.IsNullOrEmpty (document.Info.MasterPageTypeVPath)) { try { ProjectFile resolvedMaster = project.ResolveVirtualPath (document.Info.MasterPageTypeVPath, document.FileName); AspNetParsedDocument masterParsedDocument = null; if (resolvedMaster != null) masterParsedDocument = TypeSystemService.ParseFile (project, resolvedMaster.FilePath) as AspNetParsedDocument; if (masterParsedDocument != null && !String.IsNullOrEmpty (masterParsedDocument.Info.InheritedClass)) masterTypeName = masterParsedDocument.Info.InheritedClass; } catch (Exception ex) { LoggingService.LogWarning ("Error resolving master page type", ex); } if (string.IsNullOrEmpty (masterTypeName)) { var msg = string.Format ("Could not find type for master '{0}'", document.Info.MasterPageTypeVPath); result.AddError (filename, msg); return result; } } if (masterTypeName != null) { var masterProp = new CodeMemberProperty { Name = "Master", Type = new CodeTypeReference (masterTypeName), HasGet = true, HasSet = false, Attributes = MemberAttributes.Public | MemberAttributes.New | MemberAttributes.Final, }; masterProp.GetStatements.Add (new CodeMethodReturnStatement ( new CodeCastExpression (masterTypeName, new CodePropertyReferenceExpression ( new CodeBaseReferenceExpression (), "Master")))); typeDecl.Members.Add (masterProp); } //shortcut building the existing members type map if (memberList.Members.Count == 0) return result; var dom = refman.TypeCtx.Compilation; var cls = ReflectionHelper.ParseReflectionName (className).Resolve (dom); var members = GetDesignerMembers (memberList.Members.Values, cls, filename); //add fields for each control in the page foreach (var member in members) { var type = new CodeTypeReference (member.Type.FullName); typeDecl.Members.Add (new CodeMemberField (type, member.Name) { Attributes = MemberAttributes.Family }); } return result; }