public HaXeCompletion(ScintillaNet.ScintillaControl sci, int position) { this.sci = sci; this.position = position; tips = new ArrayList(); nbErrors = 0; }
static public bool HandleGeneratorCompletion(ScintillaNet.ScintillaControl Sci, bool autoHide, string word) { ContextFeatures features = ASContext.Context.Features; if (features.overrideKey != null && word == features.overrideKey) return HandleOverrideCompletion(Sci, autoHide); return false; }
public void ShowTips(ScintillaNet.ScintillaControl sciMonitor) { if (PluginCore.Controls.CompletionList.Active) PluginCore.Controls.CompletionList.Hide(); PluginCore.Controls.UITools.CallTip.Hide(); if (textParameters.comments == null) PluginCore.Controls.UITools.CallTip.CallTipShow(sciMonitor, textParameters.posParameters, textParameters.text); else PluginCore.Controls.UITools.CallTip.CallTipShow(sciMonitor, textParameters.posParameters, textParameters.text + textParameter); PluginCore.Controls.UITools.CallTip.CallTipSetHlt(startToolTip, endToolTip); }
/// <summary> /// Selects the text specified in the action point /// </summary> public static void ExecuteActionPoint(ActionPoint point, ScintillaNet.ScintillaControl sci) { if (point.EntryPosition != -1 && point.ExitPosition != -1) { Int32 start = sci.MBSafePosition(point.EntryPosition); Int32 end = sci.MBSafePosition(point.ExitPosition); sci.SetSel(start, end); } else if (point.EntryPosition != -1 && point.ExitPosition == -1) { Int32 start = sci.MBSafePosition(point.EntryPosition); sci.SetSel(start, start); } }
static public bool OnChar(ScintillaNet.ScintillaControl Sci, int Value, int position, int style) { if (style == 3 || style == 124) { switch (Value) { // documentation tag case '@': return HandleDocTagCompletion(Sci); // documentation bloc case '*': if ((position > 2) && (Sci.CharAt(position-3) == '/') && (Sci.CharAt(position-2) == '*') && ((position == 3) || (Sci.BaseStyleAt(position-4) != 3))) HandleBoxCompletion(Sci, position); break; } } return false; }
/// <summary> /// Inserts the specified snippet to the document /// </summary> public static Int32 InsertSnippetText(ScintillaNet.ScintillaControl sci, Int32 currentPosition, String snippet) { sci.BeginUndoAction(); try { Int32 newIndent; String text = snippet; if (sci.SelTextSize > 0) currentPosition -= sci.MBSafeTextLength(sci.SelText); Int32 line = sci.LineFromPosition(currentPosition); Int32 indent = sci.GetLineIndentation(line); sci.ReplaceSel(""); Int32 lineMarker = LineEndDetector.DetectNewLineMarker(text, sci.EOLMode); String newline = LineEndDetector.GetNewLineMarker(lineMarker); if (newline != "\n") text = text.Replace(newline, "\n"); newline = LineEndDetector.GetNewLineMarker((Int32)PluginBase.MainForm.Settings.EOLMode); text = PluginBase.MainForm.ProcessArgString(text).Replace(newline, "\n"); newline = LineEndDetector.GetNewLineMarker(sci.EOLMode); String[] splitted = text.Trim().Split('\n'); for (Int32 j = 0; j < splitted.Length; j++) { if (j != splitted.Length - 1) sci.InsertText(sci.CurrentPos, splitted[j] + newline); else sci.InsertText(sci.CurrentPos, splitted[j]); sci.CurrentPos += sci.MBSafeTextLength(splitted[j]) + newline.Length; if (j > 0) { line = sci.LineFromPosition(sci.CurrentPos - newline.Length); newIndent = sci.GetLineIndentation(line) + indent; sci.SetLineIndentation(line, newIndent); } } Int32 length = sci.CurrentPos - currentPosition - newline.Length; Int32 delta = PostProcessSnippets(sci, currentPosition); return length + delta; } finally { sci.EndUndoAction(); } }
/// <summary> /// Processes the snippet and template arguments /// </summary> public static Int32 PostProcessSnippets(ScintillaNet.ScintillaControl sci, Int32 currentPosition) { Int32 delta = 0; while (sci.SelectText(BOUNDARY, 0) != -1) { sci.ReplaceSel(""); delta -= BOUNDARY.Length; } String text = sci.Text; // Store text temporarily Int32 entryPosition = sci.MBSafePosition(text.IndexOf(ENTRYPOINT)); Int32 exitPosition = sci.MBSafePosition(text.IndexOf(EXITPOINT)); if (entryPosition != -1 && exitPosition != -1) { sci.SelectText(ENTRYPOINT, 0); sci.ReplaceSel(""); delta -= ENTRYPOINT.Length; sci.SelectText(EXITPOINT, 0); sci.ReplaceSel(""); delta -= EXITPOINT.Length; sci.SetSel(entryPosition, exitPosition - ENTRYPOINT.Length); } else if (entryPosition != -1 && exitPosition == -1) { sci.SelectText(ENTRYPOINT, 0); sci.ReplaceSel(""); delta -= ENTRYPOINT.Length; sci.SetSel(entryPosition, entryPosition); } else sci.SetSel(currentPosition, currentPosition); return delta; }
/// <summary> /// Generates the menu for the selected sci control /// </summary> public void GenerateSnippets(ScintillaNet.ScintillaControl sci) { String path; String content; PathWalker walker; List<String> files; items = new List<String>(); String surroundFolder = "surround"; path = Path.Combine(PathHelper.SnippetDir, surroundFolder); if (Directory.Exists(path)) { walker = new PathWalker(PathHelper.SnippetDir + surroundFolder, "*.fds", false); files = walker.GetFiles(); foreach (String file in files) { items.Add(file); } } path = Path.Combine(PathHelper.SnippetDir, sci.ConfigurationLanguage); path = Path.Combine(path, surroundFolder); if (Directory.Exists(path)) { walker = new PathWalker(path, "*.fds", false); files = walker.GetFiles(); foreach (String file in files) { items.Add(file); } } if (items.Count > 0) items.Sort(); this.DropDownItems.Clear(); foreach (String itm in items) { content = File.ReadAllText(itm); if (content.IndexOf("{0}") > -1) { this.DropDownItems.Insert(this.DropDownItems.Count, new ToolStripMenuItem(Path.GetFileNameWithoutExtension(itm))); } } }
public Styler(ScintillaNet.Scintilla ScintillaCtrl) { STLControl = ScintillaCtrl; InitStyleIndex(); LoadStyle(STLControl); //ApplyStyle(@"(\$\w+)", styleIndex["Variable"], 1); //ApplyStyle(@"(\$\w+?)\s*=[^>]", styleIndex["Variable (declare)"], 1); //ApplyStyle(@"([=+&])", styleIndex["Operators"], 1); //ApplyStyle(@"(VK_\w+)", styleIndex["Virtual-key"], 1); //ApplyStyle(@"[Uu][0-9A-Fa-f]{4}", styleIndex["Hex Notation"], 0); //ApplyStyle(@"(?:NULL)|(?:null)", styleIndex["NULL Value"], 0); //ApplyStyle(@"(\[[*^]\])", styleIndex["Any Operator"], 1); //ApplyStyle(@"(\[\$\w+\])", styleIndex["Reference"], 1); //ApplyStyle(@"([><])", styleIndex["Virtual-key Start End Operator"], 1); //ApplyStyle(@"(=>)", styleIndex["Out Operator"], 1); //ApplyStyle(@"(\(\s*(?:['""])[^\1\n]+?\1\s*\))\B", styleIndex["Switch"], 1); //ApplyStyle(@"(\\)\s+?$", styleIndex["Line Joiner"], 1); //ApplyStyle(@"((['""])[^\1\n]+?\2\B)", styleIndex["String"], 1); //ApplyStyle(@"(['""])[^\1\n]*(\\[Uu][0-9a-fA-F]{4})[^\1\n]*?\1\B", styleIndex["In-string Hex Notation"], 2); }
public ConfigStyles(ScintillaNet.Scintilla control, Dictionary<string, int> dict) { STLControl = control; nameToIndex = dict; originalStyles = new Dictionary<int, styleCopy>(); indexToName = new Dictionary<int, string>(); foreach (string name in dict.Keys) { ScintillaNet.Style thisSyle = STLControl.Styles[dict[name]]; styleCopy copy = new styleCopy(); copy.Font = thisSyle.Font; copy.ForeColor = thisSyle.ForeColor; copy.BackColor = thisSyle.BackColor; originalStyles.Add(dict[name], copy); indexToName.Add(dict[name], name); } InitializeComponent(); }
/// <summary> /// Checks if the given match actually is the declaration. /// </summary> public static bool IsMatchTheTarget(ScintillaNet.ScintillaControl Sci, SearchMatch match, ASResult target) { if (Sci == null || target == null || target.InFile == null || target.Member == null) { return false; } String originalFile = Sci.FileName; // get type at match position ASResult declaration = DeclarationLookupResult(Sci, Sci.MBSafePosition(match.Index) + Sci.MBSafeTextLength(match.Value)); return (declaration.InFile != null && originalFile == declaration.InFile.FileName) && (Sci.CurrentPos == (Sci.MBSafePosition(match.Index) + Sci.MBSafeTextLength(match.Value))); }
static public void ContextualGenerator(ScintillaNet.ScintillaControl Sci) { if (ASContext.Context is ASContext) (ASContext.Context as ASContext).UpdateCurrentFile(false); // update model if ((ASContext.Context.CurrentClass.Flags & (FlagType.Enum | FlagType.TypeDef)) > 0) return; lookupPosition = -1; int position = Sci.CurrentPos; if (Sci.BaseStyleAt(position) == 19) // on keyword return; bool isNotInterface = (ASContext.Context.CurrentClass.Flags & FlagType.Interface) == 0; int line = Sci.LineFromPosition(position); contextToken = Sci.GetWordFromPosition(position); contextMatch = null; FoundDeclaration found = GetDeclarationAtLine(Sci, line); string text = Sci.GetLine(line); bool suggestItemDeclaration = false; if (isNotInterface && !String.IsNullOrEmpty(contextToken) && Char.IsDigit(contextToken[0])) { ShowConvertToConst(found); return; } ASResult resolve = ASComplete.GetExpressionType(Sci, Sci.WordEndPosition(position, true)); contextResolved = resolve; // ignore automatic vars (MovieClip members) if (isNotInterface && resolve.Member != null && (((resolve.Member.Flags & FlagType.AutomaticVar) > 0) || (resolve.InClass != null && resolve.InClass.QualifiedName == "Object"))) { resolve.Member = null; resolve.Type = null; } if (isNotInterface && found.inClass != ClassModel.VoidClass && contextToken != null) { if (resolve.Member == null && resolve.Type != null && (resolve.Type.Flags & FlagType.Interface) > 0) // implement interface { contextParam = resolve.Type.Type; ShowImplementInterface(found); return; } if (resolve.Member != null && !ASContext.Context.CurrentClass.IsVoid() && (resolve.Member.Flags & FlagType.LocalVar) > 0) // promote to class var { contextMember = resolve.Member; ShowPromoteLocalAndAddParameter(found); return; } } if (contextToken != null && resolve.Member == null) // import declaration { if ((resolve.Type == null || resolve.Type.IsVoid() || !ASContext.Context.IsImported(resolve.Type, line)) && CheckAutoImport(found)) return; if (resolve.Type == null) { int stylemask = (1 << Sci.StyleBits) - 1; suggestItemDeclaration = ASComplete.IsTextStyle(Sci.StyleAt(position - 1) & stylemask); } } if (isNotInterface && found.member != null) { // private var -> property if ((found.member.Flags & FlagType.Variable) > 0 && (found.member.Flags & FlagType.LocalVar) == 0) { // maybe we just want to import the member's non-imported type Match m = Regex.Match(text, String.Format(patternVarDecl, found.member.Name, contextToken)); if (m.Success) { contextMatch = m; ClassModel type = ASContext.Context.ResolveType(contextToken, ASContext.Context.CurrentModel); if (type.IsVoid() && CheckAutoImport(found)) return; } ShowGetSetList(found); return; } // inside a function else if ((found.member.Flags & (FlagType.Function | FlagType.Getter | FlagType.Setter)) > 0 && resolve.Member == null && resolve.Type == null) { if (contextToken != null) { // "generate event handlers" suggestion string re = String.Format(patternEvent, contextToken); Match m = Regex.Match(text, re, RegexOptions.IgnoreCase); if (m.Success) { contextMatch = m; contextParam = CheckEventType(m.Groups["event"].Value); ShowEventList(found); return; } m = Regex.Match(text, String.Format(patternAS2Delegate, contextToken), RegexOptions.IgnoreCase); if (m.Success) { contextMatch = m; ShowDelegateList(found); return; } // suggest delegate if (ASContext.Context.Features.hasDelegates) { m = Regex.Match(text, @"([a-z0-9_.]+)\s*\+=\s*" + contextToken, RegexOptions.IgnoreCase); if (m.Success) { int offset = Sci.PositionFromLine(Sci.LineFromPosition(position)) + m.Groups[1].Index + m.Groups[1].Length; resolve = ASComplete.GetExpressionType(Sci, offset); if (resolve.Member != null) contextMember = ResolveDelegate(resolve.Member.Type, resolve.InFile); contextMatch = m; ShowDelegateList(found); return; } } } else { // insert a default handler name, then "generate event handlers" suggestion Match m = Regex.Match(text, String.Format(patternEvent, ""), RegexOptions.IgnoreCase); if (m.Success) { int regexIndex = m.Index + Sci.PositionFromLine(Sci.CurrentLine); GenerateDefaultHandlerName(Sci, position, regexIndex, m.Groups["event"].Value, true); resolve = ASComplete.GetExpressionType(Sci, Sci.CurrentPos); if (resolve.Member == null || (resolve.Member.Flags & FlagType.AutomaticVar) > 0) { contextMatch = m; contextParam = CheckEventType(m.Groups["event"].Value); ShowEventList(found); } return; } // insert default delegate name, then "generate delegate" suggestion if (ASContext.Context.Features.hasDelegates) { m = Regex.Match(text, @"([a-z0-9_.]+)\s*\+=\s*", RegexOptions.IgnoreCase); if (m.Success) { int offset = Sci.PositionFromLine(Sci.LineFromPosition(position)) + m.Groups[1].Index + m.Groups[1].Length; resolve = ASComplete.GetExpressionType(Sci, offset); if (resolve.Member != null) { contextMember = ResolveDelegate(resolve.Member.Type, resolve.InFile); string delegateName = resolve.Member.Name; if (delegateName.StartsWith("on")) delegateName = delegateName.Substring(2); GenerateDefaultHandlerName(Sci, position, offset, delegateName, false); resolve = ASComplete.GetExpressionType(Sci, Sci.CurrentPos); if (resolve.Member == null || (resolve.Member.Flags & FlagType.AutomaticVar) > 0) { contextMatch = m; ShowDelegateList(found); } return; } } } } } // "Generate fields from parameters" suggestion if (found.member != null && (found.member.Flags & FlagType.Function) > 0 && found.member.Parameters != null && (found.member.Parameters.Count > 0) && resolve.Member != null && (resolve.Member.Flags & FlagType.ParameterVar) > 0) { contextMember = resolve.Member; ShowFieldFromParameter(found); return; } // "add to interface" suggestion if (resolve.Member != null && resolve.Member.Name == found.member.Name && line == found.member.LineFrom && ((found.member.Flags & FlagType.Function) > 0 || (found.member.Flags & FlagType.Getter) > 0 || (found.member.Flags & FlagType.Setter) > 0) && found.inClass != ClassModel.VoidClass && found.inClass.Implements != null && found.inClass.Implements.Count > 0) { string funcName = found.member.Name; FlagType flags = found.member.Flags & ~FlagType.Access; List<string> interfaces = new List<string>(); foreach (string interf in found.inClass.Implements) { bool skip = false; ClassModel cm = ASContext.Context.ResolveType(interf, ASContext.Context.CurrentModel); foreach (MemberModel m in cm.Members) { if (m.Name.Equals(funcName) && m.Flags.Equals(flags)) { skip = true; break; } } if (!skip) { interfaces.Add(interf); } } if (interfaces.Count > 0) { ShowAddInterfaceDefList(found, interfaces); return; } } // "assign var to statement" suggestion int curLine = Sci.CurrentLine; string ln = Sci.GetLine(curLine).TrimEnd(); if (ln.Length > 0 && ln.IndexOf("=") == -1 && ln.Length <= Sci.CurrentPos - Sci.PositionFromLine(curLine)) // cursor at end of line { ShowAssignStatementToVarList(found); return; } } // suggest generate constructor / toString if (isNotInterface && found.member == null && found.inClass != ClassModel.VoidClass && contextToken == null) { bool hasConstructor = false; bool hasToString = false; foreach (MemberModel m in ASContext.Context.CurrentClass.Members) { if (!hasConstructor && (m.Flags & FlagType.Constructor) > 0) hasConstructor = true; if (!hasToString && (m.Flags & FlagType.Function) > 0 && m.Name.Equals("toString")) hasToString = true; } if (!hasConstructor || !hasToString) { ShowConstructorAndToStringList(found, hasConstructor, hasToString); return; } } if (isNotInterface && resolve.Member != null && resolve.Type != null && resolve.Type.QualifiedName == "String" && found.inClass != ClassModel.VoidClass) { int lineStartPos = Sci.PositionFromLine(Sci.CurrentLine); string lineStart = text.Substring(0, Sci.CurrentPos - lineStartPos); Match m = Regex.Match(lineStart, String.Format(@"new\s+(?<event>\w+)\s*\(\s*\w+", lineStart)); if (m.Success) { Group g = m.Groups["event"]; ASResult eventResolve = ASComplete.GetExpressionType(Sci, lineStartPos + g.Index + g.Length); if (eventResolve != null && eventResolve.Type != null) { ClassModel aType = eventResolve.Type; aType.ResolveExtends(); while (!aType.IsVoid() && aType.QualifiedName != "Object") { if (aType.QualifiedName == "flash.events.Event") { contextParam = eventResolve.Type.QualifiedName; ShowEventMetatagList(found); return; } aType = aType.Extends; } } } } // suggest declaration if (contextToken != null) { if (suggestItemDeclaration) { Match m = Regex.Match(text, String.Format(patternClass, contextToken)); if (m.Success) { contextMatch = m; ShowNewClassList(found); } else if (!found.inClass.IsVoid()) { m = Regex.Match(text, String.Format(patternMethod, contextToken)); if (m.Success) { contextMatch = m; ShowNewMethodList(found); } else ShowNewVarList(found); } } else { if (resolve != null && resolve.InClass != null && resolve.InClass.InFile != null && resolve.Member != null && (resolve.Member.Flags & FlagType.Function) > 0 && File.Exists(resolve.InClass.InFile.FileName) && !resolve.InClass.InFile.FileName.StartsWith(PathHelper.AppDir)) { Match m = Regex.Match(text, String.Format(patternMethodDecl, contextToken)); Match m2 = Regex.Match(text, String.Format(patternMethod, contextToken)); if (!m.Success && m2.Success) { contextMatch = m; ShowChangeMethodDeclList(found); } } else if (resolve != null && resolve.Type != null && resolve.Type.InFile != null && resolve.RelClass != null && File.Exists(resolve.Type.InFile.FileName) && !resolve.Type.InFile.FileName.StartsWith(PathHelper.AppDir)) { Match m = Regex.Match(text, String.Format(patternClass, contextToken)); if (m.Success) { contextMatch = m; ShowChangeConstructorDeclList(found); } } } } // TODO: Empty line, show generators list? }
public static void GenerateDelegateMethods(ScintillaNet.ScintillaControl Sci, MemberModel member, Dictionary<MemberModel, ClassModel> selectedMembers, ClassModel classModel, ClassModel inClass) { Sci.BeginUndoAction(); try { string result = TemplateUtils.ReplaceTemplateVariable( TemplateUtils.GetTemplate("DelegateMethodsHeader"), "Class", classModel.Type); int position = -1; ClassModel type; List<string> importsList = new List<string>(); bool isStaticMember = false; if ((member.Flags & FlagType.Static) > 0) isStaticMember = true; inClass.ResolveExtends(); Dictionary<MemberModel, ClassModel>.KeyCollection selectedMemberKeys = selectedMembers.Keys; foreach (MemberModel m in selectedMemberKeys) { MemberModel mCopy = (MemberModel) m.Clone(); string methodTemplate = NewLine; bool overrideFound = false; ClassModel baseClassType = inClass; while (baseClassType != null && !baseClassType.IsVoid()) { MemberList inClassMembers = baseClassType.Members; foreach (MemberModel inClassMember in inClassMembers) { if ((inClassMember.Flags & FlagType.Function) > 0 && m.Name.Equals(inClassMember.Name)) { mCopy.Flags |= FlagType.Override; overrideFound = true; break; } } if (overrideFound) break; baseClassType = baseClassType.Extends; } if (isStaticMember && (m.Flags & FlagType.Static) == 0) mCopy.Flags |= FlagType.Static; if ((m.Flags & FlagType.Setter) > 0) { methodTemplate += TemplateUtils.GetTemplate("Setter"); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Modifiers", (TemplateUtils.GetStaticExternOverride(m) + TemplateUtils.GetModifiers(m)).Trim()); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Name", m.Name); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "EntryPoint", ""); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Type", m.Parameters[0].Type); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Member", member.Name + "." + m.Name); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Void", ASContext.Context.Features.voidKey ?? "void"); } else if ((m.Flags & FlagType.Getter) > 0) { methodTemplate += TemplateUtils.GetTemplate("Getter"); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Modifiers", (TemplateUtils.GetStaticExternOverride(m) + TemplateUtils.GetModifiers(m)).Trim()); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Name", m.Name); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "EntryPoint", ""); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Type", FormatType(m.Type)); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Member", member.Name + "." + m.Name); } else { methodTemplate += TemplateUtils.GetTemplate("Function"); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Body", "<<$(Return) >>$(Body)"); methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "EntryPoint", null); methodTemplate = TemplateUtils.ToDeclarationWithModifiersString(mCopy, methodTemplate); if (m.Type != null && m.Type.ToLower() != "void") methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Return", "return"); else methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Return", null); // check for varargs bool isVararg = false; if (m.Parameters != null && m.Parameters.Count > 0) { MemberModel mm = m.Parameters[m.Parameters.Count - 1]; if (mm.Name.StartsWith("...")) isVararg = true; } string callMethodTemplate = TemplateUtils.GetTemplate("CallFunction"); if (!isVararg) { callMethodTemplate = TemplateUtils.ReplaceTemplateVariable(callMethodTemplate, "Name", member.Name + "." + m.Name); callMethodTemplate = TemplateUtils.ReplaceTemplateVariable(callMethodTemplate, "Arguments", TemplateUtils.CallParametersString(m)); callMethodTemplate += ";"; } else { List<MemberModel> pseudoParamsList = new List<MemberModel>(); pseudoParamsList.Add(new MemberModel("null", null, FlagType.ParameterVar, 0)); pseudoParamsList.Add(new MemberModel("[$(Subarguments)].concat($(Lastsubargument))", null, FlagType.ParameterVar, 0)); MemberModel pseudoParamsOwner = new MemberModel(); pseudoParamsOwner.Parameters = pseudoParamsList; callMethodTemplate = TemplateUtils.ReplaceTemplateVariable(callMethodTemplate, "Name", member.Name + "." + m.Name + ".apply"); callMethodTemplate = TemplateUtils.ReplaceTemplateVariable(callMethodTemplate, "Arguments", TemplateUtils.CallParametersString(pseudoParamsOwner)); callMethodTemplate += ";"; List<MemberModel> arrayParamsList = new List<MemberModel>(); for (int i = 0; i < m.Parameters.Count - 1; i++) { MemberModel param = m.Parameters[i]; arrayParamsList.Add(param); } pseudoParamsOwner.Parameters = arrayParamsList; callMethodTemplate = TemplateUtils.ReplaceTemplateVariable(callMethodTemplate, "Subarguments", TemplateUtils.CallParametersString(pseudoParamsOwner)); callMethodTemplate = TemplateUtils.ReplaceTemplateVariable(callMethodTemplate, "Lastsubargument", m.Parameters[m.Parameters.Count - 1].Name.TrimStart(new char[] { '.', ' '})); } methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "Body", callMethodTemplate); } methodTemplate = TemplateUtils.ReplaceTemplateVariable(methodTemplate, "BlankLine", NewLine); result += methodTemplate; if (m.Parameters != null) { for (int i = 0; i < m.Parameters.Count; i++) { MemberModel param = m.Parameters[i]; if (param.Type != null) { type = ASContext.Context.ResolveType(param.Type, selectedMembers[m].InFile); importsList.Add(type.QualifiedName); } } } if (position < 0) { MemberModel latest = GetLatestMemberForFunction(inClass, mCopy.Access, mCopy); if (latest == null) { position = Sci.WordStartPosition(Sci.CurrentPos, true); Sci.SetSel(position, Sci.WordEndPosition(position, true)); } else { position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); } } else { position = Sci.CurrentPos; } if (m.Type != null) { type = ASContext.Context.ResolveType(m.Type, selectedMembers[m].InFile); importsList.Add(type.QualifiedName); } } if (importsList.Count > 0 && position > -1) { int o = AddImportsByName(importsList, Sci.LineFromPosition(position)); position += o; Sci.SetSel(position, position); } InsertCode(position, result); } finally { Sci.EndUndoAction(); } }
/// <summary> /// List methods to override /// </summary> /// <param name="Sci">Scintilla control</param> /// <param name="autoHide">Don't keep the list open if the word does not match</param> /// <returns>Completion was handled</returns> static private bool HandleOverrideCompletion(ScintillaNet.ScintillaControl Sci, bool autoHide) { // explore members IASContext ctx = ASContext.Context; ClassModel curClass = ctx.CurrentClass; if (curClass.IsVoid()) return false; List<MemberModel> members = new List<MemberModel>(); curClass.ResolveExtends(); // Resolve inheritance chain // explore function or getters or setters FlagType mask = FlagType.Function | FlagType.Getter | FlagType.Setter; ClassModel tmpClass = curClass.Extends; Visibility acc = ctx.TypesAffinity(curClass, tmpClass); while (tmpClass != null && !tmpClass.IsVoid()) { if (tmpClass.QualifiedName.StartsWith("flash.utils.Proxy")) { foreach (MemberModel member in tmpClass.Members) { member.Namespace = "flash_proxy"; members.Add(member); } break; } else { foreach (MemberModel member in tmpClass.Members) if ((member.Flags & FlagType.Dynamic) > 0 && (member.Flags & mask) > 0 && (member.Access & acc) > 0) members.Add(member); tmpClass = tmpClass.Extends; // members visibility acc = ctx.TypesAffinity(curClass, tmpClass); } } members.Sort(); // build list List<ICompletionListItem> known = new List<ICompletionListItem>(); MemberModel last = null; foreach (MemberModel member in members) { if (last == null || last.Name != member.Name) known.Add(new MemberItem(member)); last = member; } if (known.Count > 0) CompletionList.Show(known, autoHide); return true; }
public static bool MakePrivate(ScintillaNet.ScintillaControl Sci, MemberModel member) { ContextFeatures features = ASContext.Context.Features; string visibility = GetPrivateKeyword(); if (features.publicKey == null || visibility == null) return false; Regex rePublic = new Regex(String.Format(@"\s*({0})\s+", features.publicKey)); string line; Match m; int index, position; for (int i = member.LineFrom; i <= member.LineTo; i++) { line = Sci.GetLine(i); m = rePublic.Match(line); if (m.Success) { index = Sci.MBSafeTextLength(line.Substring(0, m.Groups[1].Index)); position = Sci.PositionFromLine(i) + index; Sci.SetSel(position, position + features.publicKey.Length); Sci.ReplaceSel(visibility); UpdateLookupPosition(position, features.publicKey.Length - visibility.Length); return true; } } return false; }
private static bool RemoveOneLocalDeclaration(ScintillaNet.ScintillaControl Sci, MemberModel contextMember) { string type = ""; if (contextMember.Type != null && (contextMember.Flags & FlagType.Inferred) == 0) { type = FormatType(contextMember.Type); if (type.IndexOf('*') > 0) type = type.Replace("/*", @"/\*\s*").Replace("*/", @"\s*\*/"); type = @":\s*" + type; } Regex reDecl = new Regex(String.Format(@"[\s\(]((var|const)\s+{0}\s*{1})\s*", contextMember.Name, type)); for (int i = contextMember.LineFrom; i <= contextMember.LineTo + 10; i++) { string text = Sci.GetLine(i); Match m = reDecl.Match(text); if (m.Success) { int index = Sci.MBSafeTextLength(text.Substring(0, m.Groups[1].Index)); int position = Sci.PositionFromLine(i) + index; int len = Sci.MBSafeTextLength(m.Groups[1].Value); Sci.SetSel(position, position + len); if (contextMember.Type == null || (contextMember.Flags & FlagType.Inferred) != 0) Sci.ReplaceSel(contextMember.Name + " "); else Sci.ReplaceSel(contextMember.Name); UpdateLookupPosition(position, contextMember.Name.Length - len); return true; } } return false; }
private static StatementReturnType GetStatementReturnType(ScintillaNet.ScintillaControl Sci, ClassModel inClass, string line, int startPos) { Regex target = new Regex(@"[;\s\n\r]*", RegexOptions.RightToLeft); Match m = target.Match(line); if (!m.Success) { return null; } line = line.Substring(0, m.Index); if (line.Length == 0) { return null; } line = ReplaceAllStringContents(line); ASResult resolve = null; int pos = -1; string word = null; int stylemask = (1 << Sci.StyleBits) - 1; ClassModel type = null; if (line[line.Length - 1] == ')') { pos = -1; int lastIndex = 0; int bracesBalance = 0; while (true) { int pos1 = line.IndexOf("(", lastIndex); int pos2 = line.IndexOf(")", lastIndex); if (pos1 != -1 && pos2 != -1) { lastIndex = Math.Min(pos1, pos2); } else if (pos1 != -1 || pos2 != -1) { lastIndex = Math.Max(pos1, pos2); } else { break; } if (lastIndex == pos1) { bracesBalance++; if (bracesBalance == 1) { pos = lastIndex; } } else if (lastIndex == pos2) { bracesBalance--; } lastIndex++; } } else { pos = line.Length; } if (pos != -1) { line = line.Substring(0, pos); pos += startPos; pos -= line.Length - line.TrimEnd().Length + 1; pos = Sci.WordEndPosition(pos, true); resolve = ASComplete.GetExpressionType(Sci, pos); if (resolve.IsNull()) resolve = null; word = Sci.GetWordFromPosition(pos); } IASContext ctx = inClass.InFile.Context; m = Regex.Match(line, "new\\s+([\\w\\d.<>,_$-]+)+(<[^]]+>)|(<[^]]+>)", RegexOptions.IgnoreCase); if (m.Success) { string m1 = m.Groups[1].Value; string m2 = m.Groups[2].Value; string cname; if (string.IsNullOrEmpty(m1) && string.IsNullOrEmpty(m2)) cname = m.Groups[0].Value; else cname = String.Concat(m1, m2); if (cname.StartsWith("<")) cname = "Vector." + cname; // literal vector type = ctx.ResolveType(cname, inClass.InFile); if (!type.IsVoid()) resolve = null; } else { char c = (char)Sci.CharAt(pos); if (c == '"' || c == '\'') { type = ctx.ResolveType("String", inClass.InFile); } else if (c == '}') { type = ctx.ResolveType(ctx.Features.objectKey, inClass.InFile); } else if (c == '>') { type = ctx.ResolveType("XML", inClass.InFile); } else if (c == ']') { resolve = ASComplete.GetExpressionType(Sci, pos + 1); if (resolve.Type != null) type = resolve.Type; else type = ctx.ResolveType(ctx.Features.arrayKey, inClass.InFile); resolve = null; } else if (word != null && Char.IsDigit(word[0])) { type = ctx.ResolveType(ctx.Features.numberKey, inClass.InFile); } else if (word == "true" || word == "false") { type = ctx.ResolveType(ctx.Features.booleanKey, inClass.InFile); } if (type != null && type.IsVoid()) type = null; } if (resolve == null) resolve = new ASResult(); if (resolve.Type == null) resolve.Type = type; return new StatementReturnType(resolve, pos, word); }
private static List<FunctionParameter> ParseFunctionParameters(ScintillaNet.ScintillaControl Sci, int p) { List<FunctionParameter> prms = new List<FunctionParameter>(); StringBuilder sb = new StringBuilder(); List<ASResult> types = new List<ASResult>(); bool isFuncStarted = false; bool isDoubleQuote = false; bool isSingleQuote = false; bool wasEscapeChar = false; bool doBreak = false; bool writeParam = false; int subClosuresCount = 0; ASResult result = null; IASContext ctx = ASContext.Context; char[] charsToTrim = new char[] { ' ', '\t', '\r', '\n' }; int counter = Sci.TextLength; // max number of chars in parameters line (to avoid infinitive loop) string characterClass = ScintillaNet.ScintillaControl.Configuration.GetLanguage(Sci.ConfigurationLanguage).characterclass.Characters; int lastMemberPos = p; // add [] and <> while (p < counter && !doBreak) { char c = (char)Sci.CharAt(p++); if (c == '(' && !isFuncStarted) { if (sb.ToString().Trim(charsToTrim).Length == 0) { isFuncStarted = true; } else { break; } } else if (c == ';' && !isFuncStarted) { break; } else if (c == ')' && isFuncStarted && !wasEscapeChar && !isDoubleQuote && !isSingleQuote && subClosuresCount == 0) { isFuncStarted = false; writeParam = true; doBreak = true; } else if ((c == '(' || c == '[' || c == '<' || c == '{') && !wasEscapeChar && !isDoubleQuote && !isSingleQuote) { if (subClosuresCount == 0) { if (c == '{') { if (sb.ToString().TrimStart().Length > 0) { result = new ASResult(); result.Type = ctx.ResolveType("Function", null); types.Insert(0, result); } else { result = new ASResult(); result.Type = ctx.ResolveType(ctx.Features.objectKey, null); types.Insert(0, result); } } else if (c == '(') { result = ASComplete.GetExpressionType(Sci, lastMemberPos + 1); if (!result.IsNull()) { types.Insert(0, result); } } else if (c == '<') { if (sb.ToString().TrimStart().Length == 0) { result = new ASResult(); result.Type = ctx.ResolveType("XML", null); types.Insert(0, result); } } } subClosuresCount++; sb.Append(c); wasEscapeChar = false; } else if ((c == ')' || c == ']' || c == '>' || c == '}') && !wasEscapeChar && !isDoubleQuote && !isSingleQuote) { if (c == ']') { result = ASComplete.GetExpressionType(Sci, p); if (result.Type != null) result.Member = null; else result.Type = ctx.ResolveType(ctx.Features.arrayKey, null); types.Insert(0, result); writeParam = true; } subClosuresCount--; sb.Append(c); wasEscapeChar = false; } else if (c == '\\') { wasEscapeChar = !wasEscapeChar; sb.Append(c); } else if (c == '"' && !wasEscapeChar && !isSingleQuote) { isDoubleQuote = !isDoubleQuote; if (subClosuresCount == 0) { if (isDoubleQuote) { result = new ASResult(); result.Type = ctx.ResolveType("String", null); types.Add(result); } } sb.Append(c); wasEscapeChar = false; } else if (c == '\'' && !wasEscapeChar && !isDoubleQuote) { isSingleQuote = !isSingleQuote; if (subClosuresCount == 0) { if (isSingleQuote) { result = new ASResult(); result.Type = ctx.ResolveType("String", null); types.Add(result); } } sb.Append(c); wasEscapeChar = false; } else if (c == ',' && subClosuresCount == 0) { if (!isSingleQuote && !isDoubleQuote && subClosuresCount == 0) { writeParam = true; } else { sb.Append(c); } wasEscapeChar = false; } else if (isFuncStarted) { sb.Append(c); if (!isSingleQuote && !isDoubleQuote && subClosuresCount == 0 && characterClass.IndexOf(c) > -1) { lastMemberPos = p - 1; } wasEscapeChar = false; } else if (characterClass.IndexOf(c) > -1) { doBreak = true; } if (writeParam) { writeParam = false; string trimmed = sb.ToString().Trim(charsToTrim); if (trimmed.Length > 0) { result = ASComplete.GetExpressionType(Sci, lastMemberPos + 1); if (result != null && !result.IsNull()) { if (characterClass.IndexOf(trimmed[trimmed.Length - 1]) > -1) { types.Insert(0, result); } else { types.Add(result); } } else { double d = double.MaxValue; try { d = double.Parse(trimmed, System.Globalization.CultureInfo.InvariantCulture); } catch (Exception) { } if (d != double.MaxValue && d.ToString().Length == trimmed.Length) { result = new ASResult(); result.Type = ctx.ResolveType(ctx.Features.numberKey, null); types.Insert(0, result); } else if (trimmed.Equals("true") || trimmed.Equals("false")) { result = new ASResult(); result.Type = ctx.ResolveType(ctx.Features.booleanKey, null); types.Insert(0, result); } } if (types.Count == 0) { result = new ASResult(); result.Type = ctx.ResolveType(ctx.Features.objectKey, null); types.Add(result); } result = types[0]; string paramName = null; string paramType = null; string paramQualType = null; if (result.Member == null) { paramType = result.Type.Name; paramQualType = result.Type.QualifiedName; } else { if (result.Member.Name != null) { paramName = result.Member.Name.Trim('@'); } if (result.Member.Type == null || result.Member.Type.Equals("void", StringComparison.OrdinalIgnoreCase)) { paramType = result.Type.Name; paramQualType = result.Type.QualifiedName; } else { paramType = FormatType(GetShortType(result.Member.Type)); if (result.InClass == null) { paramQualType = result.Type.QualifiedName; } else { paramQualType = getQualifiedType(result.Member.Type, result.InClass); } } } prms.Add(new FunctionParameter(paramName, paramType, paramQualType, result)); } types = new List<ASResult>(); sb = new StringBuilder(); } } for (int i = 0; i < prms.Count; i++) { if (prms[i].paramType == "void") { prms[i].paramName = "object"; prms[i].paramType = null; } else prms[i].paramName = GuessVarName(prms[i].paramName, FormatType(GetShortType(prms[i].paramType))); } for (int i = 0; i < prms.Count; i++) { int iterator = -1; bool nameUnique = false; string name = prms[i].paramName; string suggestedName = name; while (!nameUnique) { iterator++; suggestedName = name + (iterator == 0 ? "" : iterator + ""); bool gotMatch = false; for (int j = 0; j < i; j++) { if (prms[j] != prms[i] && prms[j].paramName == suggestedName) { gotMatch = true; break; } } nameUnique = !gotMatch; } prms[i].paramName = suggestedName; } return prms; }
public static bool RenameMember(ScintillaNet.ScintillaControl Sci, MemberModel member, string newName) { ContextFeatures features = ASContext.Context.Features; string kind = features.varKey; if ((member.Flags & FlagType.Getter) > 0) kind = features.getKey; else if ((member.Flags & FlagType.Setter) > 0) kind = features.setKey; else if (member.Flags == FlagType.Function) kind = features.functionKey; Regex reMember = new Regex(String.Format(@"{0}\s+({1})[\s:]", kind, member.Name)); string line; Match m; int index, position; for (int i = member.LineFrom; i <= member.LineTo; i++) { line = Sci.GetLine(i); m = reMember.Match(line); if (m.Success) { index = Sci.MBSafeTextLength(line.Substring(0, m.Groups[1].Index)); position = Sci.PositionFromLine(i) + index; Sci.SetSel(position, position + member.Name.Length); Sci.ReplaceSel(newName); UpdateLookupPosition(position, 1); return true; } } return false; }
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); }
static public void GenerateOverride(ScintillaNet.ScintillaControl Sci, ClassModel ofClass, MemberModel member, int position) { ContextFeatures features = ASContext.Context.Features; List<string> typesUsed = new List<string>(); bool isProxy = (member.Namespace == "flash_proxy"); if (isProxy) typesUsed.Add("flash.utils.flash_proxy"); bool isAS2Event = ASContext.Context.Settings.LanguageId == "AS2" && member.Name.StartsWith("on"); bool isObjectMethod = ofClass.QualifiedName == "Object"; int line = Sci.LineFromPosition(position); string currentText = Sci.GetLine(line); int startPos = currentText.Length; GetStartPos(currentText, ref startPos, features.privateKey); GetStartPos(currentText, ref startPos, features.protectedKey); GetStartPos(currentText, ref startPos, features.internalKey); GetStartPos(currentText, ref startPos, features.publicKey); GetStartPos(currentText, ref startPos, features.staticKey); GetStartPos(currentText, ref startPos, features.overrideKey); startPos += Sci.PositionFromLine(line); FlagType flags = member.Flags; string acc = ""; string decl = ""; if (features.hasNamespaces && !string.IsNullOrEmpty(member.Namespace) && member.Namespace != "internal") acc = member.Namespace; else if ((member.Access & Visibility.Public) > 0) acc = features.publicKey; else if ((member.Access & Visibility.Internal) > 0) acc = features.internalKey; else if ((member.Access & Visibility.Protected) > 0) acc = features.protectedKey; else if ((member.Access & Visibility.Private) > 0 && features.methodModifierDefault != Visibility.Private) acc = features.privateKey; bool isStatic = (flags & FlagType.Static) > 0; if (isStatic) acc = features.staticKey + " " + acc; if (!isAS2Event && !isObjectMethod) acc = features.overrideKey + " " + acc; acc = Regex.Replace(acc, "[ ]+", " ").Trim(); if ((flags & (FlagType.Getter | FlagType.Setter)) > 0) { string type = member.Type; string name = member.Name; if (member.Parameters != null && member.Parameters.Count == 1) type = member.Parameters[0].Type; type = FormatType(type); if (type == null && !features.hasInference) type = features.objectKey; bool genGetter = ofClass.Members.Search(name, FlagType.Getter, 0) != null; bool genSetter = ofClass.Members.Search(name, FlagType.Setter, 0) != null; if (isHaxe) { // property is public but not the methods acc = features.overrideKey; } if (genGetter) { string tpl = TemplateUtils.GetTemplate("OverrideGetter", "Getter"); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Modifiers", acc); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Name", name); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Type", type); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Member", "super." + name); decl += tpl; } if (genSetter) { string tpl = TemplateUtils.GetTemplate("OverrideSetter", "Setter"); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Modifiers", acc); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Name", name); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Type", type); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Member", "super." + name); tpl = TemplateUtils.ReplaceTemplateVariable(tpl, "Void", ASContext.Context.Features.voidKey ?? "void"); if (decl.Length > 0) { tpl = "\n\n" + tpl.Replace("$(EntryPoint)", ""); } decl += tpl; } decl = TemplateUtils.ReplaceTemplateVariable(decl, "BlankLine", ""); } else { string type = FormatType(member.Type); //if (type == null) type = features.objectKey; decl = acc + features.functionKey + " "; bool noRet = type == null || type.Equals("void", StringComparison.OrdinalIgnoreCase); type = (noRet && type != null) ? ASContext.Context.Features.voidKey : type; if (!noRet) { string qType = getQualifiedType(type, ofClass); typesUsed.Add(qType); if (qType == type) { ClassModel rType = ASContext.Context.ResolveType(type, ofClass.InFile); if (!rType.IsVoid()) type = rType.Name; } } string action = (isProxy || isAS2Event) ? "" : GetSuperCall(member, typesUsed, ofClass); string template = TemplateUtils.GetTemplate("MethodOverride"); // fix parameters if needed if (member.Parameters != null) foreach (MemberModel para in member.Parameters) if (para.Type == "any") para.Type = "*"; template = TemplateUtils.ReplaceTemplateVariable(template, "Modifiers", acc); template = TemplateUtils.ReplaceTemplateVariable(template, "Name", member.Name); template = TemplateUtils.ReplaceTemplateVariable(template, "Arguments", TemplateUtils.ParametersString(member, true)); template = TemplateUtils.ReplaceTemplateVariable(template, "Type", type); template = TemplateUtils.ReplaceTemplateVariable(template, "Method", action); decl = template; } Sci.BeginUndoAction(); try { if (ASContext.Context.Settings.GenerateImports && typesUsed.Count > 0) { int offset = AddImportsByName(typesUsed, line); position += offset; startPos += offset; } Sci.SetSel(startPos, position + member.Name.Length); InsertCode(startPos, decl); } finally { Sci.EndUndoAction(); } }
private static void GenerateClass(ScintillaNet.ScintillaControl Sci, String className, ClassModel inClass) { AddLookupPosition(); // remember last cursor position for Shift+F4 List<FunctionParameter> parameters = ParseFunctionParameters(Sci, Sci.WordEndPosition(Sci.CurrentPos, true)); List<MemberModel> constructorArgs = new List<MemberModel>(); List<String> constructorArgTypes = new List<String>(); MemberModel paramMember = new MemberModel(); for (int i = 0; i < parameters.Count; i++) { FunctionParameter p = parameters[i]; constructorArgs.Add(new MemberModel(p.paramName, p.paramType, FlagType.ParameterVar, 0)); constructorArgTypes.Add(CleanType(getQualifiedType(p.paramQualType, inClass))); } paramMember.Parameters = constructorArgs; IProject project = PluginBase.CurrentProject; if (String.IsNullOrEmpty(className)) className = "Class"; string projFilesDir = Path.Combine(PathHelper.TemplateDir, "ProjectFiles"); string projTemplateDir = Path.Combine(projFilesDir, project.GetType().Name); string paramsString = TemplateUtils.ParametersString(paramMember, true); Hashtable info = new Hashtable(); info["className"] = className; if (project.Language.StartsWith("as")) info["templatePath"] = Path.Combine(projTemplateDir, "Class.as.fdt"); else if (project.Language.StartsWith("haxe")) info["templatePath"] = Path.Combine(projTemplateDir, "Class.hx.fdt"); else if (project.Language.StartsWith("loom")) info["templatePath"] = Path.Combine(projTemplateDir, "Class.ls.fdt"); info["inDirectory"] = Path.GetDirectoryName(inClass.InFile.FileName); info["constructorArgs"] = paramsString.Length > 0 ? paramsString : null; info["constructorArgTypes"] = constructorArgTypes; DataEvent de = new DataEvent(EventType.Command, "ProjectManager.CreateNewFile", info); EventManager.DispatchEvent(null, de); if (de.Handled) return; }
private static void GenerateDefaultHandlerName(ScintillaNet.ScintillaControl Sci, int position, int targetPos, string eventName, bool closeBrace) { string target = null; int contextOwnerPos = GetContextOwnerEndPos(Sci, Sci.WordStartPosition(targetPos, true)); if (contextOwnerPos != -1) { ASResult contextOwnerResult = ASComplete.GetExpressionType(Sci, contextOwnerPos); if (contextOwnerResult != null && !contextOwnerResult.IsNull() && contextOwnerResult.Member != null) { if (contextOwnerResult.Member.Name == "contentLoaderInfo" && Sci.CharAt(contextOwnerPos) == '.') { // we want to name the event from the loader var and not from the contentLoaderInfo parameter contextOwnerPos = GetContextOwnerEndPos(Sci, Sci.WordStartPosition(contextOwnerPos - 1, true)); if (contextOwnerPos != -1) { contextOwnerResult = ASComplete.GetExpressionType(Sci, contextOwnerPos); if (contextOwnerResult != null && !contextOwnerResult.IsNull() && contextOwnerResult.Member != null) { target = contextOwnerResult.Member.Name; } } } else { target = contextOwnerResult.Member.Name; } } } eventName = Camelize(eventName.Substring(eventName.LastIndexOf('.') + 1)); if (target != null) target = target.TrimStart(new char[] { '_' }); switch (ASContext.CommonSettings.HandlerNamingConvention) { case HandlerNamingConventions.handleTargetEventName: if (target == null) contextToken = "handle" + Capitalize(eventName); else contextToken = "handle" + Capitalize(target) + Capitalize(eventName); break; case HandlerNamingConventions.onTargetEventName: if (target == null) contextToken = "on" + Capitalize(eventName); else contextToken = "on" + Capitalize(target) + Capitalize(eventName); break; case HandlerNamingConventions.target_eventNameHandler: if (target == null) contextToken = eventName + "Handler"; else contextToken = target + "_" + eventName + "Handler"; break; default: //HandlerNamingConventions.target_eventName if (target == null) contextToken = eventName; else contextToken = target + "_" + eventName; break; } char c = (char)Sci.CharAt(position - 1); if (c == ',') InsertCode(position, "$(Boundary) " + contextToken + "$(Boundary)"); else InsertCode(position, contextToken); position = Sci.WordEndPosition(position + 1, true); Sci.SetSel(position, position); c = (char)Sci.CharAt(position); if (c <= 32) if (closeBrace) Sci.ReplaceSel(");"); else Sci.ReplaceSel(";"); Sci.SetSel(position, position); }
public static void GenerateExtractVariable(ScintillaNet.ScintillaControl Sci, string NewName) { FileModel cFile; IASContext context = ASContext.Context; Int32 pos = Sci.CurrentPos; string expression = Sci.SelText.Trim(new char[] { '=', ' ', '\t', '\n', '\r', ';', '.' }); expression = expression.TrimEnd(new char[] { '(', '[', '{', '<' }); expression = expression.TrimStart(new char[] { ')', ']', '}', '>' }); cFile = ASContext.Context.CurrentModel; ASFileParser parser = new ASFileParser(); parser.ParseSrc(cFile, Sci.Text); MemberModel current = cFile.Context.CurrentMember; string characterClass = ScintillaNet.ScintillaControl.Configuration.GetLanguage(Sci.ConfigurationLanguage).characterclass.Characters; int funcBodyStart = ASGenerator.GetBodyStart(current.LineFrom, current.LineTo, Sci); Sci.SetSel(funcBodyStart, Sci.LineEndPosition(current.LineTo)); string currentMethodBody = Sci.SelText; bool isExprInSingleQuotes = (expression.StartsWith("'") && expression.EndsWith("'")); bool isExprInDoubleQuotes = (expression.StartsWith("\"") && expression.EndsWith("\"")); int stylemask = (1 << Sci.StyleBits) - 1; int lastPos = -1; char prevOrNextChar; Sci.Colourise(0, -1); while (true) { lastPos = currentMethodBody.IndexOf(expression, lastPos + 1); if (lastPos > -1) { if (lastPos > 0) { prevOrNextChar = currentMethodBody[lastPos - 1]; if (characterClass.IndexOf(prevOrNextChar) > -1) { continue; } } if (lastPos + expression.Length < currentMethodBody.Length) { prevOrNextChar = currentMethodBody[lastPos + expression.Length]; if (characterClass.IndexOf(prevOrNextChar) > -1) { continue; } } int style = Sci.StyleAt(funcBodyStart + lastPos) & stylemask; if (ASComplete.IsCommentStyle(style)) { continue; } else if ((isExprInDoubleQuotes && currentMethodBody[lastPos] == '"' && currentMethodBody[lastPos + expression.Length - 1] == '"') || (isExprInSingleQuotes && currentMethodBody[lastPos] == '\'' && currentMethodBody[lastPos + expression.Length - 1] == '\'')) { } else if (!ASComplete.IsTextStyle(style)) { continue; } Sci.SetSel(funcBodyStart + lastPos, funcBodyStart + lastPos + expression.Length); Sci.ReplaceSel(NewName); currentMethodBody = currentMethodBody.Substring(0, lastPos) + NewName + currentMethodBody.Substring(lastPos + expression.Length); lastPos += NewName.Length; } else { break; } } Sci.CurrentPos = funcBodyStart; Sci.SetSel(Sci.CurrentPos, Sci.CurrentPos); MemberModel m = new MemberModel(NewName, "", FlagType.LocalVar, 0); m.Value = expression; string snippet = TemplateUtils.GetTemplate("Variable"); snippet = TemplateUtils.ReplaceTemplateVariable(snippet, "Modifiers", null); snippet = TemplateUtils.ToDeclarationString(m, snippet); snippet += NewLine + "$(Boundary)"; SnippetHelper.InsertSnippetText(Sci, Sci.CurrentPos, snippet); }
private static FoundDeclaration GetDeclarationAtLine(ScintillaNet.ScintillaControl Sci, int line) { FoundDeclaration result = new FoundDeclaration(); FileModel model = ASContext.Context.CurrentModel; foreach (MemberModel member in model.Members) { if (member.LineFrom <= line && member.LineTo >= line) { result.member = member; return result; } } foreach (ClassModel aClass in model.Classes) { if (aClass.LineFrom <= line && aClass.LineTo >= line) { result.inClass = aClass; foreach (MemberModel member in aClass.Members) { if (member.LineFrom <= line && member.LineTo >= line) { result.member = member; return result; } } return result; } } return result; }
public static void GenerateExtractMethod(ScintillaNet.ScintillaControl Sci, string NewName) { FileModel cFile; IASContext context = ASContext.Context; string selection = Sci.SelText; if (selection == null || selection.Length == 0) { return; } if (selection.TrimStart().Length == 0) { return; } Sci.SetSel(Sci.SelectionStart + selection.Length - selection.TrimStart().Length, Sci.SelectionEnd); Sci.CurrentPos = Sci.SelectionEnd; Int32 pos = Sci.CurrentPos; int lineStart = Sci.LineFromPosition(Sci.SelectionStart); int lineEnd = Sci.LineFromPosition(Sci.SelectionEnd); int firstLineIndent = Sci.GetLineIndentation(lineStart); int entryPointIndent = Sci.Indent; for (int i = lineStart; i <= lineEnd; i++) { int indent = Sci.GetLineIndentation(i); if (i > lineStart) { Sci.SetLineIndentation(i, indent - firstLineIndent + entryPointIndent); } } string selText = Sci.SelText; string template = TemplateUtils.GetTemplate("CallFunction"); template = TemplateUtils.ReplaceTemplateVariable(template, "Name", NewName); template = TemplateUtils.ReplaceTemplateVariable(template, "Arguments", ""); ASGenerator.InsertCode(Sci.CurrentPos, template + ";"); cFile = ASContext.Context.CurrentModel; ASFileParser parser = new ASFileParser(); parser.ParseSrc(cFile, Sci.Text); bool isAs3 = cFile.Context.Settings.LanguageId == "AS3"; FoundDeclaration found = GetDeclarationAtLine(Sci, lineStart); if (found == null || found.member == null) { return; } lookupPosition = Sci.CurrentPos; AddLookupPosition(); MemberModel latest = TemplateUtils.GetTemplateBlockMember(Sci, TemplateUtils.GetBoundary("PrivateMethods")); if (latest == null) latest = GetLatestMemberForFunction(found.inClass, ASGenerator.GetDefaultVisibility(), found.member); if (latest == null) latest = found.member; int position = Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); Sci.SetSel(position, position); FlagType flags = FlagType.Function; if ((found.member.Flags & FlagType.Static) > 0) { flags |= FlagType.Static; } MemberModel m = new MemberModel(NewName, context.Features.voidKey, flags, ASGenerator.GetDefaultVisibility()); template = NewLine + TemplateUtils.GetTemplate("Function"); template = TemplateUtils.ToDeclarationWithModifiersString(m, template); template = TemplateUtils.ReplaceTemplateVariable(template, "Body", selText); template = TemplateUtils.ReplaceTemplateVariable(template, "BlankLine", NewLine); InsertCode(position, template); }
/// <summary> /// Checks if a given search match actually points to the given target source /// </summary /// <returns>True if the SearchMatch does point to the target source.</returns> public static bool DoesMatchPointToTarget(ScintillaNet.ScintillaControl Sci, SearchMatch match, ASResult target, DocumentHelper associatedDocumentHelper) { if (Sci == null || target == null) return false; FileModel targetInFile = null; if (target.InFile != null) targetInFile = target.InFile; else if (target.Member != null && target.InClass == null) targetInFile = target.Member.InFile; Boolean matchMember = targetInFile != null && target.Member != null; Boolean matchType = target.Member == null && target.IsStatic && target.Type != null; if (!matchMember && !matchType) return false; ASResult result = null; // get type at match position if (match.Index < Sci.Text.Length) // TODO: find out rare cases of incorrect index reported { result = DeclarationLookupResult(Sci, Sci.MBSafePosition(match.Index) + Sci.MBSafeTextLength(match.Value)); if (associatedDocumentHelper != null) { // because the declaration lookup opens a document, we should register it with the document helper to be closed later associatedDocumentHelper.RegisterLoadedDocument(PluginBase.MainForm.CurrentDocument); } } // check if the result matches the target if (result == null || (result.InFile == null && result.Type == null)) return false; if (matchMember) { if (result.Member == null) return false; var resultInFile = result.InClass != null ? result.InFile : result.Member.InFile; return resultInFile.BasePath == targetInFile.BasePath && resultInFile.FileName == targetInFile.FileName && result.Member.LineFrom == target.Member.LineFrom && result.Member.Name == target.Member.Name; } else // type { if (result.Type == null) return false; if (result.Type.QualifiedName == target.Type.QualifiedName) return true; return false; } }
private static int FindNewVarPosition(ScintillaNet.ScintillaControl Sci, ClassModel inClass, MemberModel latest) { firstVar = false; // found a var? if ((latest.Flags & FlagType.Variable) > 0) return Sci.PositionFromLine(latest.LineTo + 1) - ((Sci.EOLMode == 0) ? 2 : 1); // add as first member int line = 0; int maxLine = Sci.LineCount; if (inClass != null) { line = inClass.LineFrom; maxLine = inClass.LineTo; } else if (ASContext.Context.InPrivateSection) line = ASContext.Context.CurrentModel.PrivateSectionIndex; else maxLine = ASContext.Context.CurrentModel.PrivateSectionIndex; while (line < maxLine) { string text = Sci.GetLine(line++); if (text.IndexOf('{') >= 0) { firstVar = true; return Sci.PositionFromLine(line) - ((Sci.EOLMode == 0) ? 2 : 1); } } return -1; }
/// <summary> /// Checks if a given search match actually points to the given target source /// </summary /// <returns>True if the SearchMatch does point to the target source.</returns> public static ASResult DeclarationLookupResult(ScintillaNet.ScintillaControl Sci, int position) { if (!ASContext.Context.IsFileValid || (Sci == null)) return null; // get type at cursor position ASResult result = ASComplete.GetExpressionType(Sci, position); // browse to package folder if (result.IsPackage && result.InFile != null) { return null; } // open source and show declaration if (!result.IsNull()) { if (result.Member != null && (result.Member.Flags & FlagType.AutomaticVar) > 0) return null; FileModel model = result.InFile ?? ((result.Member != null && result.Member.InFile != null) ? result.Member.InFile : null) ?? ((result.Type != null) ? result.Type.InFile : null); if (model == null || model.FileName == "") return null; ClassModel inClass = result.InClass ?? result.Type; // for Back command int lookupLine = Sci.LineFromPosition(Sci.CurrentPos); int lookupCol = Sci.CurrentPos - Sci.PositionFromLine(lookupLine); ASContext.Panel.SetLastLookupPosition(ASContext.Context.CurrentFile, lookupLine, lookupCol); // open the file if (model != ASContext.Context.CurrentModel) { // cached files declarations have no line numbers if (model.CachedModel && model.Context != null) { ASFileParser.ParseFile(model); if (inClass != null && !inClass.IsVoid()) { inClass = model.GetClassByName(inClass.Name); if (result.Member != null) result.Member = inClass.Members.Search(result.Member.Name, 0, 0); } else result.Member = model.Members.Search(result.Member.Name, 0, 0); } if (model.FileName.Length > 0 && File.Exists(model.FileName)) { ASContext.MainForm.OpenEditableDocument(model.FileName, false); } else { ASComplete.OpenVirtualFile(model); result.InFile = ASContext.Context.CurrentModel; if (result.InFile == null) return null; if (inClass != null) { inClass = result.InFile.GetClassByName(inClass.Name); if (result.Member != null) result.Member = inClass.Members.Search(result.Member.Name, 0, 0); } else if (result.Member != null) { result.Member = result.InFile.Members.Search(result.Member.Name, 0, 0); } } } if ((inClass == null || inClass.IsVoid()) && result.Member == null) return null; Sci = ASContext.CurSciControl; if (Sci == null) return null; int line = 0; string name = null; bool isClass = false; // member if (result.Member != null && result.Member.LineFrom > 0) { line = result.Member.LineFrom; name = result.Member.Name; } // class declaration else if (inClass.LineFrom > 0) { line = inClass.LineFrom; name = inClass.Name; isClass = true; // constructor foreach (MemberModel member in inClass.Members) { if ((member.Flags & FlagType.Constructor) > 0) { line = member.LineFrom; name = member.Name; isClass = false; break; } } } if (line > 0) // select { if (isClass) ASComplete.LocateMember("(class|interface)", name, line); else ASComplete.LocateMember("(function|var|const|get|set|property|[,(])", name, line); } return result; } return null; }
private static bool RemoveLocalDeclaration(ScintillaNet.ScintillaControl Sci, MemberModel contextMember) { int removed = 0; if (contextResolved != null) { contextResolved.Context.LocalVars.Items.Sort(new ByDeclarationPositionMemberComparer()); contextResolved.Context.LocalVars.Items.Reverse(); foreach (MemberModel member in contextResolved.Context.LocalVars) { if (member.Name == contextMember.Name) { RemoveOneLocalDeclaration(Sci, member); removed++; } } } if (removed == 0) return RemoveOneLocalDeclaration(Sci, contextMember); else return true; }