58
56
return proj.GetCodebehindTypeName (file.Name);
61
static void AddFail (List<CodeBehindWarning> errors, AspNetParsedDocument document, Error err)
63
errors.Add (new CodeBehindWarning (GettextCatalog.GetString (
64
"Parser failed with error {0}. CodeBehind members for this file will not be added.", err.Message),
65
document.FileName, err.Region.BeginLine, err.Region.BeginColumn));
68
public static System.CodeDom.CodeCompileUnit GenerateCodeBehind (AspNetAppProject project,
70
AspNetParsedDocument document,
71
List<CodeBehindWarning> errors)
59
public static ProjectFile GetDesignerFile (ProjectFile file)
61
var project = file.Project as AspNetAppProject;
63
var type = AspNetAppProject.DetermineWebSubtype (file.FilePath);
64
if (type != WebSubtype.WebForm && type != WebSubtype.WebControl && type != WebSubtype.MasterPage)
67
var dfName = project.LanguageBinding.GetFileName (file.FilePath + ".designer");
68
return project.Files.GetFile (dfName);
71
public static BuildResult UpdateDesignerFile (
72
CodeBehindWriter writer,
73
AspNetAppProject project,
74
ProjectFile file, ProjectFile designerFile
77
var result = new BuildResult ();
79
//parse the ASP.NET file
80
var parsedDocument = TypeSystemService.ParseFile (project, file.FilePath) as AspNetParsedDocument;
81
if (parsedDocument == null) {
82
result.AddError (string.Format ("Failed to parse file '{0}'", file.Name));
86
//TODO: ensure type system is up to date
89
result.Append (GenerateCodeBehind (project, designerFile.FilePath, parsedDocument, out ccu));
91
writer.WriteFile (designerFile.FilePath, ccu);
97
public static BuildResult GenerateCodeBehind (
98
AspNetAppProject project,
100
AspNetParsedDocument document,
101
out CodeCompileUnit ccu)
104
var result = new BuildResult ();
73
105
string className = document.Info.InheritedClass;
75
if (document.HasErrors) {
76
AddFail (errors, document, document.Errors.Where (x => x.ErrorType == ErrorType.Error).First ());
107
foreach (var err in document.Errors)
108
result.AddError (filename, err.Region.BeginLine, err.Region.BeginColumn, null, err.Message);
109
if (result.ErrorCount > 0)
80
112
if (string.IsNullOrEmpty (className))
83
115
var refman = new DocumentReferenceManager (project) { Doc = document };
84
var memberList = new MemberListVisitor (refman);
85
document.RootNode.AcceptVisit (memberList);
87
var err = memberList.Errors.Where (x => x.ErrorType == ErrorType.Error).FirstOrDefault ();
89
AddFail (errors, document, err);
116
var memberList = new MemberListBuilder (refman, document.XDocument);
119
foreach (var err in memberList.Errors)
120
result.AddError (filename, err.Region.BeginLine, err.Region.BeginColumn, null, err.Message);
121
if (result.ErrorCount > 0)
93
124
//initialise the generated type
94
var ccu = new CodeCompileUnit ();
125
ccu = new CodeCompileUnit ();
95
126
var namespac = new CodeNamespace ();
96
127
ccu.Namespaces.Add (namespac);
97
var typeDecl = new System.CodeDom.CodeTypeDeclaration () {
128
var typeDecl = new CodeTypeDeclaration {
118
149
AspNetParsedDocument masterParsedDocument = null;
119
150
if (resolvedMaster != null)
120
151
masterParsedDocument = TypeSystemService.ParseFile (project, resolvedMaster.FilePath) as AspNetParsedDocument;
121
if (masterParsedDocument != null && !String.IsNullOrEmpty (masterParsedDocument.Info.InheritedClass)) {
152
if (masterParsedDocument != null && !String.IsNullOrEmpty (masterParsedDocument.Info.InheritedClass))
122
153
masterTypeName = masterParsedDocument.Info.InheritedClass;
124
errors.Add (new CodeBehindWarning (String.Format ("Could not find type for master '{0}'",
125
document.Info.MasterPageTypeVPath),
128
154
} catch (Exception ex) {
129
errors.Add (new CodeBehindWarning (String.Format ("Could not find type for master '{0}'",
130
document.Info.MasterPageTypeVPath),
132
155
LoggingService.LogWarning ("Error resolving master page type", ex);
157
if (string.IsNullOrEmpty (masterTypeName)) {
158
var msg = string.Format ("Could not find type for master '{0}'", document.Info.MasterPageTypeVPath);
159
result.AddError (filename, msg);
136
164
if (masterTypeName != null) {
137
var masterProp = new CodeMemberProperty () {
165
var masterProp = new CodeMemberProperty {
139
167
Type = new CodeTypeReference (masterTypeName),
142
Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.New
143
| System.CodeDom.MemberAttributes.Final,
170
Attributes = MemberAttributes.Public | MemberAttributes.New | MemberAttributes.Final,
145
masterProp.GetStatements.Add (new System.CodeDom.CodeMethodReturnStatement (
146
new System.CodeDom.CodeCastExpression (masterTypeName,
147
new System.CodeDom.CodePropertyReferenceExpression (
148
new System.CodeDom.CodeBaseReferenceExpression (), "Master"))));
172
masterProp.GetStatements.Add (new CodeMethodReturnStatement (
173
new CodeCastExpression (masterTypeName,
174
new CodePropertyReferenceExpression (
175
new CodeBaseReferenceExpression (), "Master"))));
149
176
typeDecl.Members.Add (masterProp);
152
179
//shortcut building the existing members type map
153
180
if (memberList.Members.Count == 0)
156
183
var dom = refman.TypeCtx.Compilation;
157
var cls = dom.LookupType (className);
184
var cls = ReflectionHelper.ParseReflectionName (className).Resolve (dom);
158
185
var members = GetDesignerMembers (memberList.Members.Values, cls, filename);
160
187
//add fields for each control in the page