static public void GenerateJob(GeneratorJobType job, MemberModel member, ClassModel inClass, string itemLabel, Object data) { ScintillaNet.ScintillaControl Sci = ASContext.CurSciControl; lookupPosition = Sci.CurrentPos; int position; MemberModel latest = null; bool detach = true; switch (job) { case GeneratorJobType.Getter: case GeneratorJobType.Setter: case GeneratorJobType.GetterSetter: GenerateProperty(job, member, inClass, Sci); break; case GeneratorJobType.BasicEvent: case GeneratorJobType.ComplexEvent: latest = TemplateUtils.GetTemplateBlockMember(Sci, TemplateUtils.GetBoundary("EventHandlers")); if (latest == null) { if (ASContext.CommonSettings.MethodsGenerationLocations == MethodsGenerationLocations.AfterSimilarAccessorMethod) latest = GetLatestMemberForFunction(inClass, GetDefaultVisibility(), member); if (latest == null) latest = member; } position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); string type = contextParam; if (job == GeneratorJobType.BasicEvent) if (itemLabel.IndexOf("DataEvent") >= 0) type = "DataEvent"; else type = "Event"; GenerateEventHandler(contextToken, type, member, position); break; case GeneratorJobType.Delegate: position = Sci.PositionFromLine(member.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); GenerateDelegateMethod(contextToken, member, position); break; case GeneratorJobType.Constant: case GeneratorJobType.Variable: case GeneratorJobType.VariablePublic: Sci.BeginUndoAction(); try { GenerateVariableJob(job, Sci, member, detach, inClass); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.Function: case GeneratorJobType.FunctionPublic: Sci.BeginUndoAction(); try { GenerateFunctionJob(job, Sci, member, detach, inClass); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.ImplementInterface: ClassModel aType = ASContext.Context.ResolveType(contextParam, ASContext.Context.CurrentModel); if (aType.IsVoid()) return; latest = GetLatestMemberForFunction(inClass, Visibility.Public, null); if (latest == null) latest = FindLatest(0, 0, inClass, false, false); if (latest == null) return; position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); GenerateImplementation(aType, position); break; case GeneratorJobType.MoveLocalUp: Sci.BeginUndoAction(); try { if (!RemoveLocalDeclaration(Sci, contextMember)) return; position = GetBodyStart(member.LineFrom, member.LineTo, Sci); Sci.SetSel(position, position); string varType = contextMember.Type; if (varType == "") varType = null; string template = TemplateUtils.GetTemplate("Variable"); template = TemplateUtils.ReplaceTemplateVariable(template, "Name", contextMember.Name); template = TemplateUtils.ReplaceTemplateVariable(template, "Type", varType); template = TemplateUtils.ReplaceTemplateVariable(template, "Modifiers", null); template = TemplateUtils.ReplaceTemplateVariable(template, "Value", null); template += "\n$(Boundary)"; lookupPosition += SnippetHelper.InsertSnippetText(Sci, position, template); Sci.SetSel(lookupPosition, lookupPosition); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.PromoteLocal: Sci.BeginUndoAction(); try { if (!RemoveLocalDeclaration(Sci, contextMember)) return; latest = GetLatestMemberForVariable(GeneratorJobType.Variable, inClass, GetDefaultVisibility(), member); if (latest == null) return; position = FindNewVarPosition(Sci, inClass, latest); if (position <= 0) return; Sci.SetSel(position, position); contextMember.Flags -= FlagType.LocalVar; if ((member.Flags & FlagType.Static) > 0) contextMember.Flags |= FlagType.Static; contextMember.Access = GetDefaultVisibility(); GenerateVariable(contextMember, position, detach); Sci.SetSel(lookupPosition, lookupPosition); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.AddAsParameter: Sci.BeginUndoAction(); try { AddAsParameter(inClass, Sci, member, detach); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.AddImport: position = Sci.CurrentPos; if ((member.Flags & (FlagType.Class | FlagType.Enum | FlagType.Struct | FlagType.TypeDef)) == 0) { if (member.InFile == null) break; member.Type = member.Name; } Sci.BeginUndoAction(); try { int offset = InsertImport(member, true); position += offset; Sci.SetSel(position, position); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.Class: String clasName = Sci.GetWordFromPosition(Sci.CurrentPos); GenerateClass(Sci, clasName, inClass); break; case GeneratorJobType.Constructor: member = new MemberModel(inClass.Name, inClass.QualifiedName, FlagType.Constructor | FlagType.Function, Visibility.Public); GenerateFunction( member, Sci.CurrentPos, false, inClass); break; case GeneratorJobType.ToString: Sci.BeginUndoAction(); try { GenerateToString(inClass, Sci, member); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.FieldFromPatameter: Sci.BeginUndoAction(); try { GenerateFieldFromParameter(Sci, member, inClass, (Visibility)(((Hashtable)data)["scope"])); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.AddInterfaceDef: Sci.BeginUndoAction(); try { AddInterfaceDefJob(inClass, Sci, member, (String)data); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.ConvertToConst: Sci.BeginUndoAction(); try { ConvertToConst(inClass, Sci, member, detach); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.ChangeMethodDecl: Sci.BeginUndoAction(); try { ChangeMethodDecl(Sci, member, inClass); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.ChangeConstructorDecl: Sci.BeginUndoAction(); try { ChangeConstructorDecl(Sci, member, inClass); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.EventMetatag: Sci.BeginUndoAction(); try { EventMetatag(inClass, Sci, member); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.AssignStatementToVar: Sci.BeginUndoAction(); try { AssignStatementToVar(inClass, Sci, member); } finally { Sci.EndUndoAction(); } break; } }
public GeneratorItem(string label, GeneratorJobType job, MemberModel member, ClassModel inClass) { this.label = label; this.job = job; this.member = member; this.inClass = inClass; }
public GeneratorItem(string label, GeneratorJobType job, MemberModel member, ClassModel inClass, Object data) : this(label, job, member, inClass) { this.data = data; }
private static void GenerateFunctionJob(GeneratorJobType job, ScintillaNet.ScintillaControl Sci, MemberModel member, bool detach, ClassModel inClass) { int position = 0; MemberModel latest = null; bool isOtherClass = false; Visibility funcVisi = job.Equals(GeneratorJobType.FunctionPublic) ? Visibility.Public : GetDefaultVisibility(); int wordPos = Sci.WordEndPosition(Sci.CurrentPos, true); List<FunctionParameter> functionParameters = ParseFunctionParameters(Sci, wordPos); // evaluate, if the function should be generated in other class ASResult funcResult = ASComplete.GetExpressionType(Sci, Sci.WordEndPosition(Sci.CurrentPos, true)); int contextOwnerPos = GetContextOwnerEndPos(Sci, Sci.WordStartPosition(Sci.CurrentPos, true)); MemberModel isStatic = new MemberModel(); if (contextOwnerPos != -1) { ASResult contextOwnerResult = ASComplete.GetExpressionType(Sci, contextOwnerPos); if (contextOwnerResult != null) { if (contextOwnerResult.Member == null && contextOwnerResult.Type != null) { isStatic.Flags |= FlagType.Static; } } } else if (member != null && (member.Flags & FlagType.Static) > 0) { isStatic.Flags |= FlagType.Static; } if (funcResult.RelClass != null && !funcResult.RelClass.IsVoid() && !funcResult.RelClass.Equals(inClass)) { AddLookupPosition(); lookupPosition = -1; DockContent dc = ASContext.MainForm.OpenEditableDocument(funcResult.RelClass.InFile.FileName, true); Sci = ASContext.CurSciControl; isOtherClass = true; FileModel fileModel = new FileModel(); fileModel.Context = ASContext.Context; ASFileParser parser = new ASFileParser(); parser.ParseSrc(fileModel, Sci.Text); foreach (ClassModel cm in fileModel.Classes) { if (cm.QualifiedName.Equals(funcResult.RelClass.QualifiedName)) { funcResult.RelClass = cm; break; } } inClass = funcResult.RelClass; ASContext.Context.UpdateContext(inClass.LineFrom); } string blockTmpl = null; if ((isStatic.Flags & FlagType.Static) > 0) { blockTmpl = TemplateUtils.GetBoundary("StaticMethods"); } else if ((funcVisi & Visibility.Public) > 0) { blockTmpl = TemplateUtils.GetBoundary("PublicMethods"); } else { blockTmpl = TemplateUtils.GetBoundary("PrivateMethods"); } latest = TemplateUtils.GetTemplateBlockMember(Sci, blockTmpl); if (latest == null || (!isOtherClass && member == null)) { latest = GetLatestMemberForFunction(inClass, funcVisi, isStatic); // if we generate function in current class.. if (!isOtherClass) { MethodsGenerationLocations location = ASContext.CommonSettings.MethodsGenerationLocations; if (member == null) { detach = false; lookupPosition = -1; position = Sci.WordStartPosition(Sci.CurrentPos, true); Sci.SetSel(position, Sci.WordEndPosition(position, true)); } else if (latest != null && location == MethodsGenerationLocations.AfterSimilarAccessorMethod) { position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); } else { position = Sci.PositionFromLine(member.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); } } else // if we generate function in another class.. { if (latest != null) { position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); } else { position = GetBodyStart(inClass.LineFrom, inClass.LineTo, Sci); detach = false; } Sci.SetSel(position, position); } } else { position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); } // add imports to function argument types if (functionParameters.Count > 0) { List<string> l = new List<string>(); foreach (FunctionParameter fp in functionParameters) { try { l.Add(fp.paramQualType); } catch (Exception) { } } int o = AddImportsByName(l, Sci.LineFromPosition(position)); position += o; if (latest == null) Sci.SetSel(position, Sci.WordEndPosition(position, true)); else Sci.SetSel(position, position); } List<MemberModel> parameters = new List<MemberModel>(); for (int i = 0; i < functionParameters.Count; i++) { string name = functionParameters[i].paramName; string type = functionParameters[i].paramType; parameters.Add(new MemberModel(name, type, FlagType.ParameterVar, 0)); } MemberModel newMember = NewMember(contextToken, isStatic, FlagType.Function, funcVisi); newMember.Parameters = parameters; GenerateFunction(newMember, position, detach, inClass); }
private static MemberModel GetLatestMemberForVariable(GeneratorJobType job, ClassModel inClass, Visibility varVisi, MemberModel isStatic) { MemberModel latest = null; if (job.Equals(GeneratorJobType.Constant)) { if ((isStatic.Flags & FlagType.Static) > 0) { latest = FindLatest(FlagType.Constant | FlagType.Static, varVisi, inClass); } else { latest = FindLatest(FlagType.Constant, varVisi, inClass); } if (latest == null) { latest = FindLatest(FlagType.Constant, 0, inClass, true, false); } } else { if ((isStatic.Flags & FlagType.Static) > 0) { latest = FindLatest(FlagType.Variable | FlagType.Static, varVisi, inClass); if (latest == null) { latest = FindLatest(FlagType.Variable | FlagType.Static, 0, inClass, true, false); } } else { latest = FindLatest(FlagType.Variable, varVisi, inClass); } } if (latest == null) { latest = FindLatest(FlagType.Variable, varVisi, inClass, false, false); } return latest; }
private static void GenerateProperty(GeneratorJobType job, MemberModel member, ClassModel inClass, ScintillaNet.ScintillaControl Sci) { MemberModel latest; string name = GetPropertyNameFor(member); PropertiesGenerationLocations location = ASContext.CommonSettings.PropertiesGenerationLocation; latest = TemplateUtils.GetTemplateBlockMember(Sci, TemplateUtils.GetBoundary("AccessorsMethods")); if (latest != null) { location = PropertiesGenerationLocations.AfterLastPropertyDeclaration; } else { if (location == PropertiesGenerationLocations.AfterLastPropertyDeclaration) { latest = FindLatest(FlagType.Getter | FlagType.Setter, 0, inClass, false, false); } else latest = member; } if (latest == null) return; Sci.BeginUndoAction(); try { if (isHaxe) { if (name == null) name = member.Name; string args = "(default, default)"; if (job == GeneratorJobType.GetterSetter) args = "(get, set)"; else if (job == GeneratorJobType.Getter) args = "(get, null)"; else if (job == GeneratorJobType.Setter) args = "(default, set)"; MakeHaxeProperty(Sci, member, args); } else { if ((member.Access & Visibility.Public) > 0) // hide member { MakePrivate(Sci, member); } if (name == null) // rename var with starting underscore { name = member.Name; string newName = GetNewPropertyNameFor(member); if (RenameMember(Sci, member, newName)) member.Name = newName; } } int atLine = latest.LineTo + 1; if (location == PropertiesGenerationLocations.BeforeVariableDeclaration) atLine = latest.LineTo; int position = Sci.PositionFromLine(atLine) - ((Sci.EOLMode == 0) ? 2 : 1); if (job == GeneratorJobType.GetterSetter) { Sci.SetSel(position, position); GenerateGetterSetter(name, member, position); } else { if (job != GeneratorJobType.Getter) { Sci.SetSel(position, position); GenerateSetter(name, member, position); } if (job != GeneratorJobType.Setter) { Sci.SetSel(position, position); GenerateGetter(name, member, position); } } } finally { Sci.EndUndoAction(); } }
private static void GenerateVariableJob(GeneratorJobType job, ScintillaNet.ScintillaControl Sci, MemberModel member, bool detach, ClassModel inClass) { int position = 0; MemberModel latest = null; bool isOtherClass = false; Visibility varVisi = job.Equals(GeneratorJobType.Variable) ? GetDefaultVisibility() : Visibility.Public; FlagType ft = job.Equals(GeneratorJobType.Constant) ? FlagType.Constant : FlagType.Variable; // evaluate, if the variable (or constant) should be generated in other class ASResult varResult = ASComplete.GetExpressionType(Sci, Sci.WordEndPosition(Sci.CurrentPos, true)); int contextOwnerPos = GetContextOwnerEndPos(Sci, Sci.WordStartPosition(Sci.CurrentPos, true)); MemberModel isStatic = new MemberModel(); if (contextOwnerPos != -1) { ASResult contextOwnerResult = ASComplete.GetExpressionType(Sci, contextOwnerPos); if (contextOwnerResult != null) { if (contextOwnerResult.Member == null && contextOwnerResult.Type != null) { isStatic.Flags |= FlagType.Static; } } } else if (member != null && (member.Flags & FlagType.Static) > 0) { isStatic.Flags |= FlagType.Static; } ASResult returnType = null; int lineNum = Sci.CurrentLine; string line = Sci.GetLine(lineNum); Match m = Regex.Match(line, "\\b" + Regex.Escape(contextToken) + "\\("); if (m.Success) { returnType = new ASResult(); returnType.Type = ASContext.Context.ResolveType("Function", null); } else { m = Regex.Match(line, @"=\s*[^;\n\r}}]+"); if (m.Success) { int posLineStart = Sci.PositionFromLine(lineNum); if (posLineStart + m.Index >= Sci.CurrentPos) { line = line.Substring(m.Index); StatementReturnType rType = GetStatementReturnType(Sci, inClass, line, posLineStart + m.Index); if (rType != null) { returnType = rType.resolve; } } } } if (varResult.RelClass != null && !varResult.RelClass.IsVoid() && !varResult.RelClass.Equals(inClass)) { AddLookupPosition(); lookupPosition = -1; ASContext.MainForm.OpenEditableDocument(varResult.RelClass.InFile.FileName, false); Sci = ASContext.CurSciControl; isOtherClass = true; FileModel fileModel = new FileModel(); fileModel.Context = ASContext.Context; ASFileParser parser = new ASFileParser(); parser.ParseSrc(fileModel, Sci.Text); foreach (ClassModel cm in fileModel.Classes) { if (cm.QualifiedName.Equals(varResult.RelClass.QualifiedName)) { varResult.RelClass = cm; break; } } inClass = varResult.RelClass; ASContext.Context.UpdateContext(inClass.LineFrom); } latest = GetLatestMemberForVariable(job, inClass, varVisi, isStatic); // if we generate variable in current class.. if (!isOtherClass && member == null) { detach = false; lookupPosition = -1; position = Sci.WordStartPosition(Sci.CurrentPos, true); Sci.SetSel(position, Sci.WordEndPosition(position, true)); } else // if we generate variable in another class { if (latest != null) { position = FindNewVarPosition(Sci, inClass, latest); } else { position = GetBodyStart(inClass.LineFrom, inClass.LineTo, Sci); detach = false; } if (position <= 0) return; Sci.SetSel(position, position); } // if this is a constant, we assign a value to constant string returnTypeStr = null; string eventValue = null; if (job == GeneratorJobType.Constant && returnType == null) { isStatic.Flags |= FlagType.Static; eventValue = "String = \"" + Camelize(contextToken) + "\""; } else if (returnType != null) { ClassModel inClassForImport = null; if (returnType.InClass != null) { inClassForImport = returnType.InClass; } else if (returnType.RelClass != null) { inClassForImport = returnType.RelClass; } else { inClassForImport = inClass; } List<String> imports = new List<string>(); if (returnType.Member != null) { if (returnType.Member.Type != ASContext.Context.Features.voidKey) { returnTypeStr = FormatType(GetShortType(returnType.Member.Type)); imports.Add(getQualifiedType(returnType.Member.Type, inClassForImport)); } } else if (returnType != null && returnType.Type != null) { returnTypeStr = FormatType(GetShortType(returnType.Type.QualifiedName)); imports.Add(getQualifiedType(returnType.Type.QualifiedName, inClassForImport)); } if (imports.Count > 0) { position += AddImportsByName(imports, Sci.LineFromPosition(position)); Sci.SetSel(position, position); } } MemberModel newMember = NewMember(contextToken, isStatic, ft, varVisi); if (returnTypeStr != null) { newMember.Type = returnTypeStr; } else if (eventValue != null) { newMember.Type = eventValue; } GenerateVariable(newMember, position, detach); }
public string ContextualGenerator(string fileName, GeneratorJobType job, bool hasGenerator) => ContextualGenerator(sci, fileName, job, hasGenerator);
internal static string ContextualGenerator(ScintillaControl sci, string fileName, GeneratorJobType job, bool hasGenerator) { SetSrc(sci, ReadAllText(fileName)); SetCurrentFile(fileName); sci.Colourise(0, -1); var options = new List <ICompletionListItem>(); ASGenerator.ContextualGenerator(sci, options); if (hasGenerator) { Assert.IsNotEmpty(options); var item = options.Find(it => ((ASCompletion.Completion.GeneratorItem)it).job == job); Assert.IsNotNull(item); var value = item.Value; } else if (job == (GeneratorJobType)(-1)) { Assert.IsEmpty(options); return(null); } else if (options.Count > 0) { Assert.IsFalse(options.Any(it => ((ASCompletion.Completion.GeneratorItem)it).job == job)); return(null); } return(sci.Text); }
static public void GenerateJob(GeneratorJobType job, MemberModel member, ClassModel inClass, string itemLabel) { ScintillaNet.ScintillaControl Sci = ASContext.CurSciControl; lookupPosition = Sci.CurrentPos; int position; MemberModel latest; bool detach = true; switch (job) { case GeneratorJobType.Getter: case GeneratorJobType.Setter: case GeneratorJobType.GetterSetter: string name = GetPropertyNameFor(member); PropertiesGenerationLocations location = ASContext.CommonSettings.PropertiesGenerationLocation; if (location == PropertiesGenerationLocations.AfterLastPropertyDeclaration) { latest = FindLatest(FlagType.Getter | FlagType.Setter, inClass); } else latest = member; if (latest == null) return; Sci.BeginUndoAction(); try { if ((member.Access & Visibility.Public) > 0) // hide member { MakePrivate(Sci, member); } if (name == null) // rename var with starting underscore { name = member.Name; string newName = GetNewPropertyNameFor(member); if (RenameMember(Sci, member, newName)) member.Name = newName; } int atLine = latest.LineTo + 1; if (location == PropertiesGenerationLocations.BeforeVariableDeclaration) atLine = latest.LineTo; position = Sci.PositionFromLine(atLine) - ((Sci.EOLMode == 0) ? 2 : 1); if (job != GeneratorJobType.Getter) { Sci.SetSel(position, position); GenerateSetter(name, member, position); } if (job != GeneratorJobType.Setter) { Sci.SetSel(position, position); GenerateGetter(name, member, position); } } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.BasicEvent: case GeneratorJobType.ComplexEvent: position = Sci.PositionFromLine(member.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); string type = contextParam; if (job == GeneratorJobType.BasicEvent) if (itemLabel.IndexOf("DataEvent") >= 0) type = "DataEvent"; else type = "Event"; GenerateEventHandler(contextToken, type, member, position); break; case GeneratorJobType.Delegate: position = Sci.PositionFromLine(member.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); GenerateDelegateMethod(contextToken, member, position); break; case GeneratorJobType.Constant: case GeneratorJobType.Variable: case GeneratorJobType.VariablePublic: Sci.BeginUndoAction(); try { GenerateVariableJob(job, Sci, member, detach, inClass); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.Function: case GeneratorJobType.FunctionPublic: Sci.BeginUndoAction(); try { GenerateFunctionJob(job, Sci, member, detach, inClass); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.ImplementInterface: ClassModel aType = ASContext.Context.ResolveType(contextParam, ASContext.Context.CurrentModel); if (aType.IsVoid()) return; latest = FindLatest(FlagType.Function, inClass); if (latest == null) return; position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); GenerateImplementation(aType, position); break; case GeneratorJobType.PromoteLocal: if (!RemoveLocalDeclaration(Sci, contextMember)) return; latest = FindLatest(FlagType.Variable | FlagType.Constant, inClass); if (latest == null) return; position = FindNewVarPosition(Sci, inClass, latest); if (position <= 0) return; Sci.SetSel(position, position); contextMember.Flags -= FlagType.LocalVar; if ((member.Flags & FlagType.Static) > 0) contextMember.Flags |= FlagType.Static; contextMember.Access = GetDefaultVisibility(); GenerateVariable(contextMember, position, detach); Sci.SetSel(lookupPosition, lookupPosition); break; case GeneratorJobType.AddAsParameter: Sci.BeginUndoAction(); try { AddAsParameter(inClass, Sci, member, detach); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.AddImport: position = Sci.CurrentPos; if ((member.Flags & FlagType.Class) == 0) { if (member.InFile == null) break; member.Type = member.Name; } int offset = InsertImport(member, true); position += offset; Sci.SetSel(position, position); break; case GeneratorJobType.Class: String clasName = Sci.GetWordFromPosition(Sci.CurrentPos); GenerateClass(Sci, clasName, inClass); break; case GeneratorJobType.Constructor: member = new MemberModel(inClass.Name, inClass.QualifiedName, FlagType.Constructor | FlagType.Function, Visibility.Public); GenerateFunction( member, Sci.CurrentPos, false, "", inClass); break; case GeneratorJobType.ToString: Sci.BeginUndoAction(); try { GenerateToString(inClass, Sci, member); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.FieldFromPatameter: Sci.BeginUndoAction(); try { GenerateFieldFromParameter(Sci, member, inClass); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.AddInterfaceDef: Sci.BeginUndoAction(); try { AddInterfaceDefJob(inClass, Sci, member); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.ConvertToConst: Sci.BeginUndoAction(); try { ConvertToConst(inClass, Sci, member, detach); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.ChangeMethodDecl: Sci.BeginUndoAction(); try { ChangeMethodDecl(Sci, member, inClass); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.EventMetatag: Sci.BeginUndoAction(); try { EventMetatag(inClass, Sci, member); } finally { Sci.EndUndoAction(); } break; case GeneratorJobType.AssignStatementToVar: Sci.BeginUndoAction(); try { AssignStatementToVar(inClass, Sci, member); } finally { Sci.EndUndoAction(); } break; } }
string Generate(string sourceText, GeneratorJobType job, IASContext context) { sci.Text = sourceText; SnippetHelper.PostProcessSnippets(sci, 0); var currentModel = ASContext.Context.CurrentModel; new ASFileParser().ParseSrc(currentModel, sci.Text); var currentClass = currentModel.Classes[0]; ASContext.Context.CurrentClass.Returns(currentClass); var currentMember = currentClass.Members[0]; ASContext.Context.CurrentMember.Returns(currentMember); ASContext.Context.GetVisibleExternalElements().Returns(x => context.GetVisibleExternalElements()); ASContext.Context.GetCodeModel(null).ReturnsForAnyArgs(x => { var src = x[0] as string; return string.IsNullOrEmpty(src) ? null : context.GetCodeModel(src); }); ASContext.Context.ResolveType(null, null).ReturnsForAnyArgs(x => context.ResolveType(x.ArgAt<string>(0), x.ArgAt<FileModel>(1))); ASGenerator.contextToken = sci.GetWordFromPosition(sci.CurrentPos); ASGenerator.GenerateJob(job, currentMember, ASContext.Context.CurrentClass, null, null); return sci.Text; }
public string Haxe(string sourceText, GeneratorJobType job) { sci.ConfigurationLanguage = "haxe"; ASContext.Context.SetHaxeFeatures(); ASContext.Context.CurrentModel.Returns(new FileModel {haXe = true, Context = ASContext.Context}); return Generate(sourceText, job, new HaXeContext.Context(new HaXeSettings())); }
public string AS3(string sourceText, GeneratorJobType job) { sci.ConfigurationLanguage = "as3"; ASContext.Context.SetAs3Features(); ASContext.Context.CurrentModel.Returns(new FileModel { Context = ASContext.Context }); var context = new AS3Context.Context(new AS3Settings()); context.BuildClassPath(); return Generate(sourceText, job, context); }
private static void GenerateFunctionJob(GeneratorJobType job, ScintillaControl sci, MemberModel member, bool detach, ClassModel inClass) { var position = 0; bool isOtherClass = false; Visibility visibility = job.Equals(GeneratorJobType.FunctionPublic) ? Visibility.Public : GetDefaultVisibility(inClass); int wordPos = sci.WordEndPosition(sci.CurrentPos, true); List<FunctionParameter> functionParameters = ParseFunctionParameters(sci, wordPos); // evaluate, if the function should be generated in other class ASResult funcResult = ASComplete.GetExpressionType(sci, sci.WordEndPosition(sci.CurrentPos, true)); var memberIsStatic = member != null && (member.Flags & FlagType.Static) > 0; var dot = ASContext.Context.Features.dot; if (ASContext.CommonSettings.GenerateScope && !funcResult.Context.Value.Contains(dot)) { position = sci.CurrentPos; var start = sci.WordStartPosition(position, true); var length = sci.MBSafeTextLength(contextToken); sci.SetSel(start, start + length); var scope = memberIsStatic ? inClass.QualifiedName : "this"; var text = scope + dot + contextToken; sci.ReplaceSel(text); UpdateLookupPosition(position, text.Length - length); } int contextOwnerPos = GetContextOwnerEndPos(sci, sci.WordStartPosition(sci.CurrentPos, true)); MemberModel isStatic = new MemberModel(); if (contextOwnerPos != -1) { ASResult contextOwnerResult = ASComplete.GetExpressionType(sci, contextOwnerPos); if (contextOwnerResult != null && (contextOwnerResult.Member == null || (contextOwnerResult.Member.Flags & FlagType.Constructor) > 0) && contextOwnerResult.Type != null) { isStatic.Flags |= FlagType.Static; } } else if (memberIsStatic) { isStatic.Flags |= FlagType.Static; } if (funcResult.RelClass != null && !funcResult.RelClass.IsVoid() && !funcResult.RelClass.Equals(inClass)) { AddLookupPosition(); lookupPosition = -1; ASContext.MainForm.OpenEditableDocument(funcResult.RelClass.InFile.FileName, true); sci = ASContext.CurSciControl; isOtherClass = true; FileModel fileModel = new FileModel(); fileModel.Context = ASContext.Context; ASFileParser parser = new ASFileParser(); parser.ParseSrc(fileModel, sci.Text); foreach (ClassModel cm in fileModel.Classes) { if (cm.QualifiedName.Equals(funcResult.RelClass.QualifiedName)) { funcResult.RelClass = cm; break; } } inClass = funcResult.RelClass; ASContext.Context.UpdateContext(inClass.LineFrom); } string blockTmpl; if ((isStatic.Flags & FlagType.Static) > 0) { blockTmpl = TemplateUtils.GetBoundary("StaticMethods"); } else if ((visibility & Visibility.Public) > 0) { blockTmpl = TemplateUtils.GetBoundary("PublicMethods"); } else { blockTmpl = TemplateUtils.GetBoundary("PrivateMethods"); } var latest = TemplateUtils.GetTemplateBlockMember(sci, blockTmpl); if (latest == null || (!isOtherClass && member == null)) { latest = GetLatestMemberForFunction(inClass, visibility, isStatic); // if we generate function in current class.. if (!isOtherClass) { MethodsGenerationLocations location = ASContext.CommonSettings.MethodsGenerationLocations; if (member == null) { detach = false; lookupPosition = -1; position = sci.WordStartPosition(sci.CurrentPos, true); sci.SetSel(position, sci.WordEndPosition(position, true)); } else if (latest != null && location == MethodsGenerationLocations.AfterSimilarAccessorMethod) { position = sci.PositionFromLine(latest.LineTo + 1) - (sci.EOLMode == 0 ? 2 : 1); sci.SetSel(position, position); } else { position = sci.PositionFromLine(member.LineTo + 1) - (sci.EOLMode == 0 ? 2 : 1); sci.SetSel(position, position); } } else // if we generate function in another class.. { if (latest != null) { position = sci.PositionFromLine(latest.LineTo + 1) - (sci.EOLMode == 0 ? 2 : 1); } else { position = GetBodyStart(inClass.LineFrom, inClass.LineTo, sci); detach = false; } sci.SetSel(position, position); } } else { position = sci.PositionFromLine(latest.LineTo + 1) - (sci.EOLMode == 0 ? 2 : 1); sci.SetSel(position, position); } // add imports to function argument types if (functionParameters.Count > 0) { List<string> typesUsed = new List<string>(); foreach (FunctionParameter parameter in functionParameters) { try { typesUsed.Add(parameter.paramQualType); } catch (Exception) { } } int o = AddImportsByName(typesUsed, sci.LineFromPosition(position)); position += o; if (latest == null) sci.SetSel(position, sci.WordEndPosition(position, true)); else sci.SetSel(position, position); } List<MemberModel> parameters = new List<MemberModel>(); foreach (FunctionParameter parameter in functionParameters) { parameters.Add(new MemberModel(parameter.paramName, parameter.paramType, FlagType.ParameterVar, 0)); } var newMember = NewMember(contextToken, isStatic, FlagType.Function, visibility); newMember.Parameters = parameters; GenerateFunction(newMember, position, detach, inClass); }