public override bool OnCompletionInsert(ScintillaNet.ScintillaControl sci, int position, string text, char trigger) { if (text == "Vector") { string insert = null; string line = sci.GetLine(sci.LineFromPosition(position)); Match m = Regex.Match(line, @"\svar\s+(?<varname>.+)\s*:\s*Vector\.<(?<indextype>.+)(?=(>\s*=))"); if (m.Success) { insert = String.Format(".<{0}>", m.Groups["indextype"].Value); } else { m = Regex.Match(line, @"\s*=\s*new"); if (m.Success) { ASResult result = ASComplete.GetExpressionType(sci, sci.PositionFromLine(sci.LineFromPosition(position)) + m.Index); if (result != null && !result.IsNull() && result.Member != null && result.Member.Type != null) { m = Regex.Match(result.Member.Type, @"(?<=<).+(?=>)"); if (m.Success) { insert = String.Format(".<{0}>", m.Value); } } } if (insert == null) { if (trigger == '.' || trigger == '(') { return(true); } insert = ".<>"; sci.InsertText(position + text.Length, insert); sci.CurrentPos = position + text.Length + 2; sci.SetSel(sci.CurrentPos, sci.CurrentPos); ASComplete.HandleAllClassesCompletion(sci, "", false, true); return(true); } } if (insert == null) { return(false); } if (trigger == '.') { sci.InsertText(position + text.Length, insert.Substring(1)); sci.CurrentPos = position + text.Length; } else { sci.InsertText(position + text.Length, insert); sci.CurrentPos = position + text.Length + insert.Length; } sci.SetSel(sci.CurrentPos, sci.CurrentPos); return(true); } return(false); }
public new ASResult GetVarOfForeachStatement(ScintillaControl sci, int startPosition) { var result = new ASResult(); var parCount = 0; var characterClass = ScintillaControl.Configuration.GetLanguage(sci.ConfigurationLanguage).characterclass.Characters; var endPosition = sci.TextLength; var pos = startPosition; while (pos < endPosition) { if (!sci.PositionIsOnComment(pos)) { var c = (char)sci.CharAt(pos); if (c > ' ') { if (parCount == 0 && c == '(') { parCount++; } else if (parCount == 1 && characterClass.IndexOf(c) != -1) { pos = sci.WordEndPosition(pos, true); result = ASComplete.GetExpressionType(sci, pos); break; } } } pos++; } return(result); }
private void OnMouseHover(ScintillaNet.ScintillaControl sci, int position) { if (ASContext.Locked || !ASContext.Context.IsFileValid()) { return; } // get word at mouse position int style = sci.BaseStyleAt(position); DebugConsole.Trace("Style=" + style); if (!ASComplete.IsTextStyle(style)) { return; } position = sci.WordEndPosition(position, true); ASResult result = ASComplete.GetExpressionType(sci, position); // set tooltip if (!result.IsNull()) { string text = ASComplete.GetToolTipText(result); DebugConsole.Trace("SHOW " + text); if (text == null) { return; } // show tooltip InfoTip.ShowAtMouseLocation(text); } }
private void ProcessMouseMove(Point point) { int position = sciControl.PositionFromPointClose(point.X, point.Y); if (position < 0) { SetCurrentWord(null); return; } if (ASContext.Context.IsFileValid) { Word word = new Word(); word.StartPos = sciControl.WordStartPosition(position, true); word.EndPos = sciControl.WordEndPosition(position, true); ASResult result = ASComplete.GetExpressionType(sciControl, word.EndPos); if (!result.IsNull()) { SetCurrentWord(word); } else { SetCurrentWord(null); } } }
/// <summary> /// Display completion list or calltip info /// </summary> private void OnChar(ScintillaNet.ScintillaControl Sci, int Value) { if (Sci.Lexer == 3 || Sci.Lexer == 4) { ASComplete.OnChar(Sci, Value, true); } }
private void ContextChanged() { ITabbedDocument doc = PluginBase.MainForm.CurrentDocument; bool isValid = false; if (doc.IsEditable) { ScintillaNet.ScintillaControl sci = ASContext.CurSciControl; if (currentDoc == doc.FileName && sci != null) { int line = sci.LineFromPosition(currentPos); ASContext.SetCurrentLine(line); } else { ASComplete.CurrentResolvedContext = null; // force update } isValid = ASContext.Context.IsFileValid; if (isValid) { ASComplete.ResolveContext(sci); } } else { ASComplete.ResolveContext(null); } bool enableItems = isValid && !doc.IsUntitled; pluginUI.OutlineTree.Enabled = ASContext.Context.CurrentModel != null; SetItemsEnabled(enableItems, ASContext.Context.CanBuild); }
private bool OpenVirtualFileModel(string virtualPath) { int p = virtualPath.IndexOf("::"); if (p < 0) { return(false); } string container = virtualPath.Substring(0, p); string ext = Path.GetExtension(container).ToLower(); if (ext != ".loomlib") { return(false); } if (!File.Exists(container)) { return(false); } string fileName = Path.Combine(container, virtualPath.Substring(p + 2).Replace('.', Path.DirectorySeparatorChar)); PathModel path = new PathModel(container, contextInstance); if (path.HasFile(fileName)) { FileModel model = path.GetFile(fileName); ASComplete.OpenVirtualFile(model); return(true); } return(false); }
private void OnMouseHover(ScintillaNet.ScintillaControl sci, int position) { if (!ASContext.Context.IsFileValid) { return; } lastHoverPosition = position; // get word at mouse position int style = sci.BaseStyleAt(position); if (!ASComplete.IsTextStyle(style)) { return; } position = sci.WordEndPosition(position, true); ASResult result = ASComplete.GetExpressionType(sci, position); // set tooltip if (!result.IsNull()) { string text = ASComplete.GetToolTipText(result); if (text == null) { return; } // show tooltip UITools.Tip.ShowAtMouseLocation(text); } }
public void ResolveDotContext_issue750(string sourceText, MemberModel code) { ((HaXeSettings)ASContext.Context.Settings).CompletionMode = HaxeCompletionModeEnum.FlashDevelop; SetSrc(sci, sourceText); var expr = ASComplete.GetExpression(sci, sci.CurrentPos); var list = ASContext.Context.ResolveDotContext(sci, expr, false); if (code == null) { Assert.IsNull(list); } else { var members = ASContext.Context.ResolveType(ASContext.Context.Features.stringKey, ASContext.Context.CurrentModel) .Members.Items.Where(it => !it.Flags.HasFlag(FlagType.Static) && it.Access.HasFlag(Visibility.Public)) .ToArray(); var expectedList = new MemberList(); foreach (var member in members) { expectedList.Add(member); } expectedList.Add(code); expectedList.Sort(); Assert.AreEqual(expectedList, list); } }
public virtual ASResult GetCollectionOfForeachStatement(ScintillaControl sci, int startPosition) { var result = new ASResult(); var parCount = 0; var endPosition = sci.TextLength; var pos = startPosition; while (pos < endPosition) { if (!sci.PositionIsOnComment(pos)) { var c = (char)sci.CharAt(pos); if (c > ' ') { if (c == '(') { parCount++; } else if (c == ')') { parCount--; if (parCount == 0) { result = ASComplete.GetExpressionType(sci, pos); break; } } } } pos++; } return(result); }
bool OpenVirtualFileModel(string virtualPath) { var p = virtualPath.IndexOfOrdinal("::"); if (p < 0) { return(false); } var container = virtualPath.Substring(0, p); if (!File.Exists(container)) { return(false); } var ext = Path.GetExtension(container).ToLower(); if (ext == ".swf" || ext == ".swc") { var fileName = Path.Combine(container, virtualPath.Substring(p + 2).Replace('.', Path.DirectorySeparatorChar)); var path = new PathModel(container, contextInstance); var parser = new ContentParser(path.Path); parser.Run(); AbcConverter.Convert(parser, path, contextInstance); if (!path.HasFile(fileName)) { return(false); } var model = path.GetFile(fileName); ASComplete.OpenVirtualFile(model); return(true); } return(false); }
void ProcessMouseMove(Point point) { int position = sci.PositionFromPointClose(point.X, point.Y); if (position < 0) { SetCurrentWord(null); } else if (ASContext.Context.IsFileValid) { Word word = new Word { StartPos = sci.WordStartPosition(position, true), EndPos = sci.WordEndPosition(position, true) }; ASResult expr = ASComplete.GetExpressionType(sci, word.EndPos); if (expr.IsNull()) { string overrideKey = ASContext.Context.Features.overrideKey; if (expr.Context == null || !expr.Context.BeforeBody || string.IsNullOrEmpty(overrideKey) || sci.GetWordFromPosition(position) != overrideKey) { word = null; } } SetCurrentWord(word); } }
private void OnUpdateCallTip(ScintillaNet.ScintillaControl sci, int position) { if (ASComplete.HasCalltip()) { ASComplete.HandleFunctionCompletion(sci, false, true); } }
/// <summary> /// Open a file in the classpath (physical or virtual) or a specific context /// </summary> public FileModel OpenFile(string filename, IASContext context) { if (context == null || context.Classpath == null) { return(null); } FileModel model = null; foreach (PathModel aPath in context.Classpath) { if (aPath.HasFile(filename)) { model = aPath.GetFile(filename); break; } } if (model != null) { if (File.Exists(model.FileName)) { ASContext.MainForm.OpenEditableDocument(model.FileName, false); } else { ASComplete.OpenVirtualFile(model); model = ASContext.Context.CurrentModel; } } return(model); }
/// <summary> /// Display completion list or calltip info /// </summary> private void OnChar(ScintillaNet.ScintillaControl Sci, int Value) { DebugConsole.Trace(Value); if (Sci.Lexer == 3) { ASComplete.OnChar(Sci, Value, true); } }
public void SimpleTest() { //TODO: Improve this test with more checks! var pluginMain = Substitute.For <PluginMain>(); var pluginUiMock = new PluginUIMock(pluginMain); pluginMain.MenuItems.Returns(new List <System.Windows.Forms.ToolStripItem>()); pluginMain.Settings.Returns(new GeneralSettings()); pluginMain.Panel.Returns(pluginUiMock); ASContext.GlobalInit(pluginMain); ASContext.Context = Substitute.For <IASContext>(); ASContext.Context.CurrentLine = 9; var asContext = new AS3Context.Context(new AS3Settings()); ASContext.Context.Features.Returns(asContext.Features); ASContext.Context.GetCodeModel(null).ReturnsForAnyArgs(x => asContext.GetCodeModel(x.ArgAt <string>(0))); // Maybe we want to get the filemodel from ASFileParser even if we won't get a controlled environment? var member = new MemberModel("test1", "void", FlagType.Function, Visibility.Public) { LineFrom = 4, LineTo = 10, Parameters = new List <MemberModel> { new MemberModel("arg1", "String", FlagType.ParameterVar, Visibility.Default), new MemberModel("arg2", "Boolean", FlagType.ParameterVar, Visibility.Default) { Value = "false" } } }; var classModel = new ClassModel(); classModel.Name = "ASCompleteTest"; classModel.Members.Add(member); var fileModel = new FileModel(); fileModel.Classes.Add(classModel); classModel.InFile = fileModel; ASContext.Context.CurrentModel.Returns(fileModel); ASContext.Context.CurrentClass.Returns(classModel); ASContext.Context.CurrentMember.Returns(member); var sci = GetBaseScintillaControl(); sci.Text = TestFile.ReadAllText("ASCompletion.Test_Files.completion.as3.SimpleTest.as"); sci.ConfigurationLanguage = "as3"; sci.Colourise(0, -1); var result = ASComplete.GetExpressionType(sci, 185); Assert.True(result.Context != null && result.Context.LocalVars != null); Assert.AreEqual(4, result.Context.LocalVars.Count); }
/// <summary> /// Retrieves the refactoring target based on the current location. /// Note that this will look up to the declaration source. /// This allows users to execute the rename from a reference to the source rather than having to navigate to the source first. /// </summary> public static ASResult GetDefaultRefactorTarget() { ScintillaControl sci = PluginBase.MainForm.CurrentDocument.SciControl; if (!ASContext.Context.IsFileValid || (sci == null)) { return(null); } int position = sci.WordEndPosition(sci.CurrentPos, true); return(ASComplete.GetExpressionType(sci, position)); }
private bool OpenVirtualFileModel(string virtualPath) { int p = virtualPath.IndexOf("::"); if (p < 0) { return(false); } string container = virtualPath.Substring(0, p); string ext = Path.GetExtension(container).ToLower(); if (ext != ".swf" && ext != ".swc" && ext != ".ane") { return(false); } if (!File.Exists(container)) { return(false); } string fileName = Path.Combine(container, virtualPath.Substring(p + 2).Replace('.', Path.DirectorySeparatorChar)); PathModel path = new PathModel(container, contextInstance); ContentParser parser = new ContentParser(path.Path); parser.Run(); AbcConverter.Convert(parser, path, contextInstance); if (path.HasFile(fileName)) { FileModel model = path.GetFile(fileName); ASComplete.OpenVirtualFile(model); return(true); } int split = fileName.LastIndexOf(Path.DirectorySeparatorChar) + 1; fileName = fileName.Substring(0, split) + "package.as"; if (path.HasFile(fileName)) { FileModel model = path.GetFile(fileName); ASComplete.OpenVirtualFile(model); return(true); } fileName = fileName.Substring(0, split) + "toplevel.as"; if (path.HasFile(fileName)) { FileModel model = path.GetFile(fileName); ASComplete.OpenVirtualFile(model); return(true); } return(false); }
private static List <ICompletionListItem> GetAutoCompletionValuesFromType(string type) { if (type == "Boolean") { return(new List <ICompletionListItem>() { new HtmlAttributeItem("true"), new HtmlAttributeItem("false") }); } else if (type == "Class") { ASComplete.HandleAllClassesCompletion(PluginBase.MainForm.CurrentDocument.SciControl, tokenContext, true, false); } else if (type == "Function") { ClassModel tmpClass = mxmlContext.model.GetPublicClass(); Visibility acc = Visibility.Default | Visibility.Internal | Visibility.Private | Visibility.Protected | Visibility.Public; tmpClass.ResolveExtends(); List <ICompletionListItem> result = null; var validTypes = new Dictionary <string, bool>(); while (tmpClass != null && !tmpClass.IsVoid()) { foreach (MemberModel member in tmpClass.Members) { if ((member.Flags & FlagType.Function) > 0 && (member.Access & acc) > 0) { if (result == null) { result = new List <ICompletionListItem>(); } result.Add(new MemberItem(member)); } } tmpClass = tmpClass.Extends; if (tmpClass != null && tmpClass.InFile.Package == "" && tmpClass.Name == "Object") { break; } // members visibility // TODO: Take into account namespaces! acc = Visibility.Protected | Visibility.Public; } return(result); } return(null); }
/// <summary> /// Gets the result for menu updating from current position. /// </summary> private ASResult GetResultFromCurrentPosition() { ITabbedDocument document = PluginBase.MainForm.CurrentDocument; if (document == null || document.SciControl == null || !ASContext.Context.IsFileValid) { return(null); } Int32 position = document.SciControl.WordEndPosition(document.SciControl.CurrentPos, true); ASResult result = ASComplete.GetExpressionType(document.SciControl, position); return(result == null && result.IsNull() ? null : result); }
protected override string GetSnippetVar(ScintillaControl sci, EForeach expr) { var result = TemplateUtils.GetTemplate("AssignVariable"); result = TemplateUtils.ReplaceTemplateVariable(result, "Name", expr.Variable.Context.Value); result = TemplateUtils.ReplaceTemplateVariable(result, "Type", GetVariableType(expr)); result = TemplateUtils.ReplaceTemplateVariable(result, "EntryPoint", string.Empty); var context = (ASComplete.CurrentResolvedContext.Result ?? new ASResult()).Context; var iterator = ASComplete.FindFreeIterator(ASContext.Context, ASContext.Context.CurrentClass, context); result += $"{expr.Collection.Member.Name}.get({iterator});"; return(result); }
/// <summary> /// Display completion list or calltip info /// </summary> private void OnChar(ScintillaNet.ScintillaControl Sci, int Value) { if (ASContext.Locked) { return; } DebugConsole.Trace(Value); if (Sci.Lexer == 3) { ASComplete.OnChar(Sci, Value, true); } }
private void OnUpdateCallTip(ScintillaNet.ScintillaControl sci, int position) { if (ASComplete.HasCalltip()) { int pos = sci.CurrentPos - 1; char c = (char)sci.CharAt(pos); if ((c == ',' || c == '(') && sci.BaseStyleAt(pos) == 0) { sci.Colourise(0, -1); } ASComplete.HandleFunctionCompletion(sci, false, true); } }
public ComaExpression Haxe(string text) { ASContext.Context = new HaXeContext.Context(new HaXeSettings()); var sci = GetBaseScintillaControl(); sci.Text = text; sci.ConfigurationLanguage = "haxe"; var coma = ASComplete.DisambiguateComa(sci, text.Length, 0); return(coma); }
static void ListView_DoubleClick(object sender, EventArgs e) { var selection = listView.Items[listView.SelectedIndices[0]]; var reference = (Reference)selection.Tag; HideList(); if (PluginBase.MainForm.CurrentDocument.SciControl != null) { ASComplete.SaveLastLookupPosition(PluginBase.MainForm.CurrentDocument.SciControl); } PluginBase.MainForm.OpenEditableDocument(reference.File, false); PluginBase.MainForm.CurrentDocument.SciControl.GotoLine(reference.Line); }
static private void CompleteTemplate(string Context) { // get indentation ScintillaNet.ScintillaControl Sci = ASContext.CurSciControl; if (Sci == null) { return; } int position = Sci.CurrentPos; int line = Sci.LineFromPosition(position); int indent = Sci.LineIndentPosition(line) - Sci.PositionFromLine(line); string tab = Sci.GetLine(line).Substring(0, indent); // get EOL int eolMode = Sci.EOLMode; string newline = ASComplete.GetNewLineMarker(eolMode); string star = PluginBase.Settings.CommentBlockStyle == CommentBlockStyle.Indented ? " *" : "*"; // empty box if (Context == null) { Sci.ReplaceSel(newline + tab + star + " " + newline + tab + star + "/"); position += newline.Length + tab.Length + 1 + star.Length; Sci.SetSel(position, position); } // method details else { string box = newline + tab + star + " "; Match mFun = re_splitFunction.Match(Context); if (mFun.Success && !re_property.IsMatch(mFun.Groups["fname"].Value)) { // parameters MemberList list = ParseMethodParameters(mFun.Groups["params"].Value); foreach (MemberModel param in list) { box += newline + tab + star + " @param\t" + param.Name; } // return type Match mType = re_variableType.Match(mFun.Groups["type"].Value); if (mType.Success && !mType.Groups["type"].Value.Equals("void", StringComparison.OrdinalIgnoreCase)) { box += newline + tab + star + " @return"; //+mType.Groups["type"].Value; } } box += newline + tab + star + "/"; Sci.ReplaceSel(box); position += newline.Length + tab.Length + 1 + star.Length; Sci.SetSel(position, position); } }
public static void Execute() { if (Globals.SciControl == null) { return; } ScintillaControl sci = Globals.SciControl; //Project project = (Project) PluginBase.CurrentProject; //if (project == null) return; MainForm mainForm = (MainForm)Globals.MainForm; ITabbedDocument document = mainForm.CurrentDocument; String dir = Path.GetDirectoryName(document.FileName); Hashtable details = ASComplete.ResolveElement(sci, null); IASContext context = ASContext.Context; ClassModel cClass = context.CurrentClass; string package = context.CurrentModel.Package; sci.BeginUndoAction(); if (sci.SelText == "") { sci.SelectionStart = sci.PositionFromLine(cClass.LineFrom); sci.SelectionEnd = sci.PositionFromLine(cClass.LineTo + 1); } String content = Regex.Replace( sci.SelText, @"^", "\t", RegexOptions.Multiline); String contents = "package " + package + " {\n" + content + "\n}"; TraceManager.Add(contents); //TraceManager.Add(cClass.LineTo.ToString()); Encoding encoding = sci.Encoding; String file = dir + "\\" + cClass.Name + ".as"; FileHelper.WriteFile(file, contents, encoding); sci.Clear(); sci.EndUndoAction(); }
public override void ResolveTopLevelElement(string token, ASResult result) { if (topLevel != null && topLevel.Members.Count > 0) { // current class ClassModel inClass = ASContext.Context.CurrentClass; if (token == "this") { result.Member = topLevel.Members.Search("this", 0, 0); if (inClass.IsVoid()) { inClass = ASContext.Context.ResolveType(result.Member.Type, null); } result.Type = inClass; result.InFile = ASContext.Context.CurrentModel; return; } else if (token == "super") { if (inClass.IsVoid()) { MemberModel thisMember = topLevel.Members.Search("this", 0, 0); inClass = ASContext.Context.ResolveType(thisMember.Type, null); } inClass.ResolveExtends(); ClassModel extends = inClass.Extends; if (!extends.IsVoid()) { result.Member = topLevel.Members.Search("super", 0, 0); result.Type = extends; result.InFile = extends.InFile; return; } } else if (token == "global") { return; } // other top-level elements ASComplete.FindMember(token, topLevel, result, 0, 0); if (!result.IsNull()) { return; } } }
static void RenameMember(ClassModel inClass, string name, string newName, bool outputResults) { MemberModel m = inClass.Members.Items.FirstOrDefault(it => it.Name == name); if (m == null) { return; } ASResult result = new ASResult(); ASComplete.FindMember(name, inClass, result, FlagType.Dynamic | FlagType.Function, 0); if (result.Member == null) { return; } queue.Add(new Rename(result, outputResults, newName)); }
private static List <ICompletionListItem> GetAutoCompletionValuesFromType(string type) { if (type == "Boolean") { return(new List <ICompletionListItem>() { new HtmlAttributeItem("true"), new HtmlAttributeItem("false") }); } else if (type == "Class") { ASComplete.HandleAllClassesCompletion(PluginBase.MainForm.CurrentDocument.SciControl, tokenContext, true, false); } return(null); }