public void Update() { AbortExecution(); var ctxt = Completion.DCodeCompletionSupport.CreateCurrentContext(); var stmt = DResolver.SearchStatementDeeplyAt(ctxt.ScopedBlock, ctxt.CurrentContext.Caret); if (stmt == null) { return; } evalThread = new Thread(execTh) { IsBackground = true, Priority = ThreadPriority.Lowest }; evalThread.Start(new Tuple <ISyntaxRegion, ResolutionContext>(stmt, ctxt)); }
public void BeginUpdate() { if (hasBegun) { return; } hasBegun = true; currentCol = Document.Editor.Caret.Column; currentLine = Document.Editor.Caret.Line; var caret = new CodeLocation(currentCol, currentLine); currentBlock = DResolver.SearchBlockAt(Ast, caret); currentStmt = DResolver.SearchStatementDeeplyAt(currentBlock, caret); isBeforeBlockStart = currentBlock != null && caret < currentBlock.BlockStartLocation; isAtStmtStart = currentStmt != null && caret == currentStmt.Location; }
protected override void BuildCompletionDataInternal(IEditorData Editor, char enteredChar) { MemberCompletionEnumeration.EnumAllAvailableMembers( CompletionDataGenerator, curBlock, Editor.CaretLocation, Editor.ParseCache, visibleMembers, new ConditionalCompilationFlags(Editor)); var bits = new BitArray(DTokens.MaxToken, false); CompletionDataGenerator.Add(DTokens.__EOF__); // Insert typable keywords if ((visibleMembers & MemberFilter.BlockKeywords) != 0) { for (byte tk = DTokens.MaxToken - 1; tk > 0; tk--) { if (!bits [tk] && IsBlockKw(tk)) { CompletionDataGenerator.Add(tk); bits [tk] = true; } } } if ((visibleMembers & MemberFilter.StatementBlockKeywords) != 0) { foreach (var kv in statementKeywords) { if (!bits [kv]) { CompletionDataGenerator.Add(kv); bits [kv] = true; } } } if ((visibleMembers & MemberFilter.ExpressionKeywords) != 0) { foreach (var kv in expressionKeywords) { if (!bits [kv]) { CompletionDataGenerator.Add(kv); bits [kv] = true; } } } if ((visibleMembers & MemberFilter.Labels) != 0) { var stmt = DResolver.SearchStatementDeeplyAt(curBlock, Editor.CaretLocation); bool addedSwitchKWs = false; while (stmt != null && stmt.Parent != null) { stmt = stmt.Parent; if (!addedSwitchKWs && stmt is SwitchStatement) { addedSwitchKWs = true; CompletionDataGenerator.Add(DTokens.Case); CompletionDataGenerator.Add(DTokens.Default); } } if (stmt != null) { stmt.Accept(new LabelVisitor(CompletionDataGenerator)); } } if ((visibleMembers & MemberFilter.x86Registers) != 0) { foreach (var kv in AsmRegisterExpression.x86RegisterTable) { CompletionDataGenerator.AddTextItem(kv.Key, kv.Value); } } if ((visibleMembers & MemberFilter.x64Registers) != 0) { foreach (var kv in AsmRegisterExpression.x64RegisterTable) { CompletionDataGenerator.AddTextItem(kv.Key, kv.Value); } } if ((visibleMembers & (MemberFilter.x86Registers | MemberFilter.x64Registers)) != 0) { CompletionDataGenerator.Add(DTokens.__LOCAL_SIZE); CompletionDataGenerator.AddTextItem("offsetof", ""); CompletionDataGenerator.AddTextItem("seg", "The seg means load the segment number that the symbol is in. This is not relevant for flat model code. Instead, do a move from the relevant segment register."); // Provide AsmTypePrefixes CompletionDataGenerator.AddTextItem("near", ""); CompletionDataGenerator.AddTextItem("far", ""); CompletionDataGenerator.AddTextItem("word", ""); CompletionDataGenerator.AddTextItem("dword", ""); CompletionDataGenerator.AddTextItem("qword", ""); CompletionDataGenerator.AddTextItem("ptr", ""); } if ((visibleMembers & MemberFilter.BuiltInPropertyAttributes) != 0) { foreach (var propAttr in PropertyAttributeCompletionItems) { CompletionDataGenerator.AddPropertyAttribute(propAttr); } } }