示例#1
0
        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);
                }
            }
        }
        protected override void BuildCompletionDataInternal(IEditorData Editor, char enteredChar)
        {
            MemberCompletionEnumeration.EnumAllAvailableMembers(
                CompletionDataGenerator,
                curBlock,
                curStmt,
                Editor.CaretLocation,
                Editor.ParseCache,
                visibleMembers,
                new ConditionalCompilationFlags(Editor));

            //TODO: Split the keywords into such that are allowed within block statements and non-block statements
            // Insert typable keywords
            if ((visibleMembers & MemberFilter.Keywords) != 0)
            {
                foreach (var kv in DTokens.Keywords)
                {
                    CompletionDataGenerator.Add(kv.Key);
                }
            }
            else if ((visibleMembers & MemberFilter.StructsAndUnions) != 0)
            {
                foreach (var kv in DTokens.BasicTypes_Array)
                {
                    CompletionDataGenerator.Add(kv);
                }
            }

            if ((visibleMembers & MemberFilter.Labels) != 0)
            {
                IStatement stmt = curStmt;
                do
                {
                    stmt = stmt.Parent;
                    if (stmt is SwitchStatement)
                    {
                        CompletionDataGenerator.Add(DTokens.Case);
                        CompletionDataGenerator.Add(DTokens.Default);
                        break;
                    }
                } while(stmt != null && stmt.Parent != null);

                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);
                }
            }
        }