/// <summary> /// Resolve inheritance chain starting with this class /// </summary> public void ResolveExtends() { ClassModel aClass = this; BeginResolveExtend(aClass); try { while (!aClass.IsVoid()) { aClass = aClass.ResolveExtendedType(); } } finally { EndResolveExtend(); } }
private ClassModel ResolveExtendedType() { if (InFile.Context == null) { resolvedExtend = null; return(VoidClass); } if (ExtendsType == null || ExtendsType.Length == 0) { if (this == VoidClass || (Flags & FlagType.Interface) > 0) { resolvedExtend = null; return(VoidClass); } ExtendsType = InFile.Context.DefaultInheritance(InFile.Package, Name); if (ExtendsType == QualifiedName) { ExtendsType = InFile.Context.Features.voidKey; resolvedExtend = null; return(VoidClass); } } ClassModel extends = InFile.Context.ResolveType(ExtendsType, InFile); if (!extends.IsVoid()) { // check loops in inheritance if (extensionList != null) { foreach (ClassModel model in extensionList) { if (model.QualifiedName == extends.QualifiedName) { if (extends.Name == InFile.Context.Features.objectKey) { break; } string info = String.Format(TextHelper.GetString("ASCompletion.Info.InheritanceLoop"), Type, extensionList[0].Type); PluginCore.Controls.MessageBar.ShowWarning(info); resolvedExtend = null; return(VoidClass); } } extensionList.Add(extends); } extends.InFile.Check(); } resolvedExtend = new WeakReference(extends); return(extends); }
private static void GenerateImplementation(ClassModel aType, int position) { List<string> typesUsed = new List<string>(); StringBuilder sb = new StringBuilder(TemplateUtils.ReplaceTemplateVariable(TemplateUtils.GetTemplate("ImplementHeader"), "Class", aType.Type)); sb.Append(NewLine); bool entry = true; ASResult result = new ASResult(); IASContext context = ASContext.Context; ClassModel cClass = context.CurrentClass; ContextFeatures features = context.Features; bool canGenerate = false; aType.ResolveExtends(); // resolve inheritance chain while (!aType.IsVoid() && aType.QualifiedName != "Object") { foreach (MemberModel method in aType.Members) { if ((method.Flags & (FlagType.Function | FlagType.Getter | FlagType.Setter)) == 0 || method.Name == aType.Name) continue; // check if method exists ASComplete.FindMember(method.Name, cClass, result, method.Flags, 0); if (!result.IsNull()) continue; string decl = entry ? NewLine : ""; if ((method.Flags & FlagType.Getter) > 0) decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Getter")); else if ((method.Flags & FlagType.Setter) > 0) decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Setter")); else decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Function")); decl = TemplateUtils.ReplaceTemplateVariable(decl, "Member", "_" + method.Name); decl = TemplateUtils.ReplaceTemplateVariable(decl, "Void", features.voidKey); decl = TemplateUtils.ReplaceTemplateVariable(decl, "Body", null); decl = TemplateUtils.ReplaceTemplateVariable(decl, "BlankLine", NewLine); if (!entry) { decl = TemplateUtils.ReplaceTemplateVariable(decl, "EntryPoint", null); } decl += NewLine; entry = false; sb.Append(decl); canGenerate = true; addTypeOnce(typesUsed, getQualifiedType(method.Type, aType)); if (method.Parameters != null && method.Parameters.Count > 0) foreach (MemberModel param in method.Parameters) addTypeOnce(typesUsed, getQualifiedType(param.Type, aType)); } // interface inheritance aType = aType.Extends; } if (!canGenerate) return; ScintillaNet.ScintillaControl Sci = ASContext.CurSciControl; Sci.BeginUndoAction(); try { position = Sci.CurrentPos; if (ASContext.Context.Settings.GenerateImports && typesUsed.Count > 0) { int offset = AddImportsByName(typesUsed, Sci.LineFromPosition(position)); position += offset; Sci.SetSel(position, position); } InsertCode(position, sb.ToString()); } finally { Sci.EndUndoAction(); } }
private static void GenerateImplementation(ClassModel iType, ClassModel inClass, ScintillaControl sci, bool detached) { List<string> typesUsed = new List<string>(); StringBuilder sb = new StringBuilder(); string header = TemplateUtils.ReplaceTemplateVariable(TemplateUtils.GetTemplate("ImplementHeader"), "Class", iType.Type); header = TemplateUtils.ReplaceTemplateVariable(header, "BlankLine", detached ? BlankLine : null); sb.Append(header); sb.Append(NewLine); bool entry = true; ASResult result = new ASResult(); IASContext context = ASContext.Context; ContextFeatures features = context.Features; bool canGenerate = false; bool isHaxe = IsHaxe; FlagType flags = (FlagType.Function | FlagType.Getter | FlagType.Setter); if (isHaxe) flags |= FlagType.Variable; iType.ResolveExtends(); // resolve inheritance chain while (!iType.IsVoid() && iType.QualifiedName != "Object") { foreach (MemberModel method in iType.Members) { if ((method.Flags & flags) == 0 || method.Name == iType.Name) continue; // check if method exists ASComplete.FindMember(method.Name, inClass, result, method.Flags, 0); if (!result.IsNull()) continue; string decl; if ((method.Flags & FlagType.Getter) > 0) { if (isHaxe) { decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Property")); string templateName = null; string metadata = null; if (method.Parameters[0].Name == "get") { if (method.Parameters[1].Name == "set") { templateName = "GetterSetter"; metadata = "@:isVar"; } else templateName = "Getter"; } else if (method.Parameters[1].Name == "set") { templateName = "Setter"; } decl = TemplateUtils.ReplaceTemplateVariable(decl, "MetaData", metadata); if (templateName != null) { var accessor = NewLine + TemplateUtils.ToDeclarationString(method, TemplateUtils.GetTemplate(templateName)); accessor = TemplateUtils.ReplaceTemplateVariable(accessor, "Modifiers", null); accessor = TemplateUtils.ReplaceTemplateVariable(accessor, "Member", method.Name); decl += accessor; } } else decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Getter")); } else if ((method.Flags & FlagType.Setter) > 0) decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Setter")); else if ((method.Flags & FlagType.Function) > 0) decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Function")); else decl = NewLine + TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Variable")); decl = TemplateUtils.ReplaceTemplateVariable(decl, "Member", "_" + method.Name); decl = TemplateUtils.ReplaceTemplateVariable(decl, "Void", features.voidKey); decl = TemplateUtils.ReplaceTemplateVariable(decl, "Body", null); decl = TemplateUtils.ReplaceTemplateVariable(decl, "BlankLine", NewLine); if (!entry) { decl = TemplateUtils.ReplaceTemplateVariable(decl, "EntryPoint", null); } decl += NewLine; entry = false; sb.Append(decl); canGenerate = true; AddTypeOnce(typesUsed, GetQualifiedType(method.Type, iType)); if (method.Parameters != null && method.Parameters.Count > 0) foreach (MemberModel param in method.Parameters) AddTypeOnce(typesUsed, GetQualifiedType(param.Type, iType)); } // interface inheritance iType = iType.Extends; } if (!canGenerate) return; sci.BeginUndoAction(); try { int position = sci.CurrentPos; if (ASContext.Context.Settings.GenerateImports && typesUsed.Count > 0) { int offset = AddImportsByName(typesUsed, sci.LineFromPosition(position)); position += offset; sci.SetSel(position, position); } InsertCode(position, sb.ToString(), sci); } finally { sci.EndUndoAction(); } }
private static void GenerateImplementation(ClassModel aType, int position) { List<string> typesUsed = new List<string>(); StringBuilder sb = new StringBuilder(String.Format(GetTemplate("ImplementHeader"), aType.Type)); string entry = "$(EntryPoint)"; ASResult result = new ASResult(); IASContext context = ASContext.Context; ClassModel cClass = context.CurrentClass; ContextFeatures features = context.Features; bool canGenerate = false; string template = GetTemplate("ImplementPart"); aType.ResolveExtends(); // resolve inheritance chain while (!aType.IsVoid() && aType.QualifiedName != "Object") { foreach (MemberModel method in aType.Members) { if ((method.Flags & (FlagType.Function | FlagType.Getter | FlagType.Setter)) == 0 || method.Name == aType.Name) continue; // check if method exists ASComplete.FindMember(method.Name, cClass, result, method.Flags, 0); if (!result.IsNull()) continue; string decl = String.Format(template, GetDeclaration(method), entry); entry = ""; sb.Append(decl); canGenerate = true; addTypeOnce(typesUsed, getQualifiedType(method.Type, aType)); if (method.Parameters != null && method.Parameters.Count > 0) foreach (MemberModel param in method.Parameters) addTypeOnce(typesUsed, getQualifiedType(param.Type, aType)); } // interface inheritance aType = aType.Extends; } if (!canGenerate) return; ScintillaNet.ScintillaControl Sci = ASContext.CurSciControl; Sci.BeginUndoAction(); try { position = Sci.CurrentPos; if (ASContext.Context.Settings.GenerateImports && typesUsed.Count > 0) { int offset = AddImportsByName(typesUsed, Sci.LineFromPosition(position)); position += offset; Sci.SetSel(position, position); } InsertCode(position, sb.ToString()); } finally { Sci.EndUndoAction(); } }