internal void Add(string expression, XmlNamespaceManager names, object item, bool forceExternal)
 {
     bool flag = false;
     OpcodeBlock newBlock = new OpcodeBlock();
     newBlock.Append(new NoOpOpcode(OpcodeID.QueryTree));
     if (!forceExternal)
     {
         try
         {
             MultipleResultOpcode opcode;
             ValueDataType none = ValueDataType.None;
             newBlock.Append(QueryMatcher.CompileForInternalEngine(expression, names, QueryCompilerFlags.InverseQuery, out none));
             if (!this.match)
             {
                 opcode = new QueryMultipleResultOpcode();
             }
             else
             {
                 opcode = new MatchMultipleResultOpcode();
             }
             opcode.AddItem(item);
             newBlock.Append(opcode);
             flag = true;
             newBlock = new OpcodeBlock(this.elim.Add(item, newBlock.First));
             base.subExprVars = this.elim.VariableCount;
         }
         catch (QueryCompileException)
         {
         }
     }
     if (!flag)
     {
         newBlock.Append(QueryMatcher.CompileForExternalEngine(expression, names, item, this.match));
     }
     QueryTreeBuilder builder = new QueryTreeBuilder();
     base.query = builder.Build(base.query, newBlock);
     this.lastLookup[item] = builder.LastOpcode;
 }