public bool Group(int n, TextBuffer tb) { MemReg mr=Bounds(n); if(mr==null) return false; int _in; tb.Append(data,_in=mr._in,mr._out-_in); return true; }
public void AppendSubstitution(MatchResult match, TextBuffer res) { if(str!=null) res.Append(str); }
internal override void Append(MatchResult match, TextBuffer dest) { if(prefix!=null) dest.Append(prefix); if(str!=null) dest.Append(str); }
internal override void Append(MatchResult match, TextBuffer dest) { if(prefix!=null) dest.Append(prefix); if(index==null) return; int id=match.Pattern.GroupId(index); if(match.IsCaptured(id)) match.Group(id,dest); }
// injects the namespace mapping at the top private void _injectMapping(XmlNamespaceMap mapping) { if (!StronglyTyped) return; var buffer = new TextBuffer(this); buffer.Indent(); buffer.BeginClause(BplJsonParser.NAMESPACE_ATTR); buffer.Indent("{"); var pairs = mapping.ToArray(); for (int i = 0, N = pairs.Length; i < N; i++) { buffer.BeginClause(pairs[i].Item1); buffer.Append(Quote(pairs[i].Item2.ToString())); buffer.EndClause(i == N - 1); } buffer.Outdent("}"); buffer.EndClause(false); var k = 1; if (PrettyPrint) k += NewLineChars.Length; _output.Insert(k, buffer.ToString()); }
public void TextWithGroupRuby(UString baseText, UString rubyText) { var baseBuffer = new TextBuffer(_zwSize, _wordWrap, _advancing, _latinMetric, 64); var rubyBuffer = new TextBuffer(_rubyZwSize, _wordWrap, _advancing, _latinMetric, 128); _buffer.MoveLastLetterStateTo(baseBuffer); baseBuffer.Append(baseText); rubyBuffer.Append(rubyText); _buffer.AppendObject(new GroupRuby(baseBuffer.ToArray(), rubyBuffer.ToArray())); baseBuffer.MoveLastLetterStateTo(_buffer); baseBuffer.Clear(); rubyBuffer.Clear(); }
public override TextBuffer ToJava(int indent, BytecodeMappingTracer tracer) { TextBuffer buf = new TextBuffer(); buf.Append(ExprProcessor.ListToJava(varDefinitions, indent, tracer)); buf.Append(first.ToJava(indent, tracer)); if (IsLabeled()) { buf.AppendIndent(indent).Append("label").Append(this.id.ToString()).Append(":").AppendLineSeparator (); tracer.IncrementCurrentSourceLine(); } buf.AppendIndent(indent).Append(headexprent[0].ToJava(indent, tracer)).Append(" {" ).AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); if (ifstat == null) { bool semicolon = false; if (ifedge.@explicit) { semicolon = true; if (ifedge.GetType() == StatEdge.Type_Break) { // break buf.AppendIndent(indent + 1).Append("break"); } else { // continue buf.AppendIndent(indent + 1).Append("continue"); } if (ifedge.labeled) { buf.Append(" label").Append(ifedge.closure.id.ToString()); } } if (semicolon) { buf.Append(";").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); } } else { buf.Append(ExprProcessor.JmpWrapper(ifstat, indent + 1, true, tracer)); } bool elseif = false; if (elsestat != null) { if (elsestat.type == Statement.Type_If && (elsestat.varDefinitions.Count == 0) && (elsestat.GetFirst().GetExprents().Count == 0) && !elsestat.IsLabeled() && ((elsestat .GetSuccessorEdges(Statedge_Direct_All).Count == 0) || !elsestat.GetSuccessorEdges (Statedge_Direct_All)[0].@explicit)) { // else if buf.AppendIndent(indent).Append("} else "); TextBuffer content = ExprProcessor.JmpWrapper(elsestat, indent, false, tracer); content.SetStart(TextUtil.GetIndentString(indent).Length); buf.Append(content); elseif = true; } else { BytecodeMappingTracer else_tracer = new BytecodeMappingTracer(tracer.GetCurrentSourceLine () + 1); TextBuffer content = ExprProcessor.JmpWrapper(elsestat, indent + 1, false, else_tracer ); if (content.Length() > 0) { buf.AppendIndent(indent).Append("} else {").AppendLineSeparator(); tracer.SetCurrentSourceLine(else_tracer.GetCurrentSourceLine()); tracer.AddTracer(else_tracer); buf.Append(content); } } } if (!elseif) { buf.AppendIndent(indent).Append("}").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); } return(buf); }
// precedence of new public override TextBuffer ToJava(int indent, BytecodeMappingTracer tracer) { TextBuffer buf = new TextBuffer(); if (anonymous) { ClassesProcessor.ClassNode child = DecompilerContext.GetClassProcessor().GetMapRootClasses ().GetOrNull(newType.value); // IDEA-204310 - avoid backtracking later on for lambdas (causes spurious imports) if (!enumConst && (!lambda || DecompilerContext.GetOption(IFernflowerPreferences .Lambda_To_Anonymous_Class))) { string enclosing = null; if (!lambda && constructor != null) { enclosing = GetQualifiedNewInstance(child.anonymousClassType.value, constructor.GetLstParameters (), indent, tracer); if (enclosing != null) { buf.Append(enclosing).Append('.'); } } buf.Append("new "); string typename = ExprProcessor.GetCastTypeName(child.anonymousClassType); if (enclosing != null) { ClassesProcessor.ClassNode anonymousNode = DecompilerContext.GetClassProcessor(). GetMapRootClasses().GetOrNull(child.anonymousClassType.value); if (anonymousNode != null) { typename = anonymousNode.simpleName; } else { typename = Sharpen.Runtime.Substring(typename, typename.LastIndexOf('.') + 1); } } GenericClassDescriptor descriptor = ClassWriter.GetGenericClassDescriptor(child.classStruct ); if (descriptor != null) { if ((descriptor.superinterfaces.Count == 0)) { buf.Append(GenericMain.GetGenericCastTypeName(descriptor.superclass)); } else { if (descriptor.superinterfaces.Count > 1 && !lambda) { DecompilerContext.GetLogger().WriteMessage("Inconsistent anonymous class signature: " + child.classStruct.qualifiedName, IFernflowerLogger.Severity.Warn); } buf.Append(GenericMain.GetGenericCastTypeName(descriptor.superinterfaces[0])); } } else { buf.Append(typename); } } buf.Append('('); if (!lambda && constructor != null) { List <Exprent> parameters = constructor.GetLstParameters(); List <VarVersionPair> mask = child.GetWrapper().GetMethodWrapper(ICodeConstants.Init_Name , constructor.GetStringDescriptor()).synthParameters; if (mask == null) { InvocationExprent superCall = child.superInvocation; mask = ExprUtil.GetSyntheticParametersMask(superCall.GetClassname(), superCall.GetStringDescriptor (), parameters.Count); } int start = enumConst ? 2 : 0; bool firstParam = true; for (int i = start; i < parameters.Count; i++) { if (mask == null || mask[i] == null) { if (!firstParam) { buf.Append(", "); } ExprProcessor.GetCastedExprent(parameters[i], constructor.GetDescriptor().@params [i], buf, indent, true, tracer); firstParam = false; } } } buf.Append(')'); if (enumConst && buf.Length() == 2) { buf.SetLength(0); } if (lambda) { if (!DecompilerContext.GetOption(IFernflowerPreferences.Lambda_To_Anonymous_Class )) { buf.SetLength(0); } // remove the usual 'new <class>()', it will be replaced with lambda style '() ->' Exprent methodObject = constructor == null ? null : constructor.GetInstance(); TextBuffer clsBuf = new TextBuffer(); new ClassWriter().ClassLambdaToJava(child, clsBuf, methodObject, indent, tracer); buf.Append(clsBuf); tracer.IncrementCurrentSourceLine(clsBuf.CountLines()); } else { TextBuffer clsBuf = new TextBuffer(); new ClassWriter().ClassToJava(child, clsBuf, indent, tracer); buf.Append(clsBuf); tracer.IncrementCurrentSourceLine(clsBuf.CountLines()); } } else if (directArrayInit) { VarType leftType = newType.DecreaseArrayDim(); buf.Append('{'); for (int i = 0; i < lstArrayElements.Count; i++) { if (i > 0) { buf.Append(", "); } ExprProcessor.GetCastedExprent(lstArrayElements[i], leftType, buf, indent, false, tracer); } buf.Append('}'); } else if (newType.arrayDim == 0) { if (!enumConst) { string enclosing = null; if (constructor != null) { enclosing = GetQualifiedNewInstance(newType.value, constructor.GetLstParameters() , indent, tracer); if (enclosing != null) { buf.Append(enclosing).Append('.'); } } buf.Append("new "); string typename = ExprProcessor.GetTypeName(newType); if (enclosing != null) { ClassesProcessor.ClassNode newNode = DecompilerContext.GetClassProcessor().GetMapRootClasses ().GetOrNull(newType.value); if (newNode != null) { typename = newNode.simpleName; } else { typename = Sharpen.Runtime.Substring(typename, typename.LastIndexOf('.') + 1); } } buf.Append(typename); } if (constructor != null) { List <Exprent> parameters = constructor.GetLstParameters(); List <VarVersionPair> mask = ExprUtil.GetSyntheticParametersMask(constructor.GetClassname (), constructor.GetStringDescriptor(), parameters.Count); int start = enumConst ? 2 : 0; if (!enumConst || start < parameters.Count) { buf.Append('('); bool firstParam = true; for (int i = start; i < parameters.Count; i++) { if (mask == null || mask[i] == null) { Exprent expr = parameters[i]; VarType leftType = constructor.GetDescriptor().@params[i]; if (i == parameters.Count - 1 && expr.GetExprType() == VarType.Vartype_Null && ProbablySyntheticParameter (leftType.value)) { break; } // skip last parameter of synthetic constructor call if (!firstParam) { buf.Append(", "); } ExprProcessor.GetCastedExprent(expr, leftType, buf, indent, true, false, true, true , tracer); firstParam = false; } } buf.Append(')'); } } } else if (isVarArgParam) { // just print the array elements VarType leftType = newType.DecreaseArrayDim(); for (int i = 0; i < lstArrayElements.Count; i++) { if (i > 0) { buf.Append(", "); } // new String[][]{{"abc"}, {"DEF"}} => new String[]{"abc"}, new String[]{"DEF"} Exprent element = lstArrayElements[i]; if (element.type == Exprent_New) { ((NewExprent)element).SetDirectArrayInit(false); } ExprProcessor.GetCastedExprent(element, leftType, buf, indent, false, tracer); } // if there is just one element of Object[] type it needs to be casted to resolve ambiguity if (lstArrayElements.Count == 1) { VarType elementType = lstArrayElements[0].GetExprType(); if (elementType.type == ICodeConstants.Type_Object && elementType.value.Equals("java/lang/Object" ) && elementType.arrayDim >= 1) { buf.Prepend("(Object)"); } } } else { buf.Append("new ").Append(ExprProcessor.GetTypeName(newType)); if ((lstArrayElements.Count == 0)) { for (int i = 0; i < newType.arrayDim; i++) { buf.Append('['); if (i < lstDims.Count) { buf.Append(lstDims[i].ToJava(indent, tracer)); } buf.Append(']'); } } else { for (int i = 0; i < newType.arrayDim; i++) { buf.Append("[]"); } VarType leftType = newType.DecreaseArrayDim(); buf.Append('{'); for (int i = 0; i < lstArrayElements.Count; i++) { if (i > 0) { buf.Append(", "); } ExprProcessor.GetCastedExprent(lstArrayElements[i], leftType, buf, indent, false, tracer); } buf.Append('}'); } } return(buf); }
public override TextBuffer ToJava(int indent, BytecodeMappingTracer tracer) { TextBuffer buf = new TextBuffer(); buf.Append(ExprProcessor.ListToJava(varDefinitions, indent, tracer)); if (IsLabeled()) { buf.AppendIndent(indent).Append("label").Append(this.id.ToString()).Append(":").AppendLineSeparator (); tracer.IncrementCurrentSourceLine(); } switch (looptype) { case Loop_Do: { buf.AppendIndent(indent).Append("while(true) {").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); buf.Append(ExprProcessor.JmpWrapper(first, indent + 1, false, tracer)); buf.AppendIndent(indent).Append("}").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); break; } case Loop_Dowhile: { buf.AppendIndent(indent).Append("do {").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); buf.Append(ExprProcessor.JmpWrapper(first, indent + 1, false, tracer)); buf.AppendIndent(indent).Append("} while(").Append(conditionExprent[0].ToJava(indent , tracer)).Append(");").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); break; } case Loop_While: { buf.AppendIndent(indent).Append("while(").Append(conditionExprent[0].ToJava(indent , tracer)).Append(") {").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); buf.Append(ExprProcessor.JmpWrapper(first, indent + 1, false, tracer)); buf.AppendIndent(indent).Append("}").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); break; } case Loop_For: { buf.AppendIndent(indent).Append("for("); if (initExprent[0] != null) { buf.Append(initExprent[0].ToJava(indent, tracer)); } buf.Append("; ").Append(conditionExprent[0].ToJava(indent, tracer)).Append("; "). Append(incExprent[0].ToJava(indent, tracer)).Append(") {").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); buf.Append(ExprProcessor.JmpWrapper(first, indent + 1, false, tracer)); buf.AppendIndent(indent).Append("}").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); break; } } return(buf); }