/* Some debugging code for(inti=0;i<lineData.size();i++){ LineInfoli=(LineInfo)lineData.get(i); System.out.print(li.toString()); }
*/ //Incorporate each LineInfo into the previous LineInfo's //outputLineIncrement, if possible int i = 0; while (i < lineData.size() - 1) {
LineInfo li = lineData.get(i);
LineInfo liNext = lineData.get(i + 1); if (!liNext.lineFileIDSet
&& liNext.inputStartLine == li.inputStartLine
&& liNext.inputLineCount == 1
&& li.inputLineCount == 1
&& liNext.outputStartLine
== li.outputStartLine
+ li.inputLineCount * li.outputLineIncrement) {
li.setOutputLineIncrement(
liNext.outputStartLine
- li.outputStartLine
+ liNext.outputLineIncrement);
lineData.remove(i + 1);
} else {
i++;
}
}
//Incorporate each LineInfo into the previous LineInfo's //inputLineCount, if possible
i = 0; while (i < lineData.size() - 1) {
LineInfo li = lineData.get(i);
LineInfo liNext = lineData.get(i + 1); if (!liNext.lineFileIDSet
&& liNext.inputStartLine == li.inputStartLine + li.inputLineCount
&& liNext.outputLineIncrement == li.outputLineIncrement
&& liNext.outputStartLine
== li.outputStartLine
+ li.inputLineCount * li.outputLineIncrement) {
li.setInputLineCount(li.inputLineCount + liNext.inputLineCount);
lineData.remove(i + 1);
} else {
i++;
}
}
}
/** *Addscompleteinformationaboutasimplelinemapping.Specify *allthefieldsinthismethod;theback-endmachinerytakescare *ofprintingonlythosethatarenecessaryinthefinalSMAP. *(Myviewisthatfieldsareoptionalprimarilyforspatialefficiency, *notforprogrammerconvenience.Couldalwaysaddutilitymethods *later.) * *@paraminputStartLinestartinglineinthesourcefile *(SMAP<code>InputStartLine</code>) *@paraminputFileNamethefilepath(orname)fromwhichtheinputcomes *(yieldsSMAP<code>LineFileID</code>)Useunqualifiednames *carefully,andonlywhentheyuniquelyidentifyafile. *@paraminputLineCountthenumberoflinesintheinputtomap *(SMAP<code>LineFileCount</code>) *@paramoutputStartLinestartinglineintheoutputfile *(SMAP<code>OutputStartLine</code>) *@paramoutputLineIncrementnumberofoutputlinestomaptoeach *inputline(SMAP<code>OutputLineIncrement</code>).<i>Giventhe *factthatthenamestartswith"output",Icontinuouslyhave *thesubconsciousurgetocallthisfield *<code>OutputLineExcrement</code>.</i>
*/ publicvoid addLineData( int inputStartLine,
String inputFileName, int inputLineCount, int outputStartLine, int outputLineIncrement) { // check the input - what are you doing here?? int fileIndex = filePathList.indexOf(inputFileName); if (fileIndex == -1) { thrownew IllegalArgumentException( "inputFileName: " + inputFileName);
}
//Jasper incorrectly SMAPs certain Nodes, giving them an //outputStartLine of 0. This can cause a fatal error in //optimizeLineSection, making it impossible for Jasper to //compile the JSP. Until we can fix the underlying //SMAPping problem, we simply ignore the flawed SMAP entries. if (outputStartLine == 0) { return;
}
// build the LineInfo
LineInfo li = new LineInfo();
li.setInputStartLine(inputStartLine);
li.setInputLineCount(inputLineCount);
li.setOutputStartLine(outputStartLine);
li.setOutputLineIncrement(outputLineIncrement); if (fileIndex != lastFileID) {
li.setLineFileID(fileIndex);
}
lastFileID = fileIndex;
public String getClassFileName() { return classFileName;
}
//********************************************************************* // Methods to retrieve information
@Override public String toString() { return getSmapStringInternal();
}
public String getSmapString() {
if (outputFileName == null) { thrownew IllegalStateException();
}
return getSmapStringInternal();
}
private String getSmapStringInternal() {
StringBuilder out = new StringBuilder();
// start the SMAP
out.append("SMAP\n");
out.append(outputFileName + '\n');
out.append("JSP\n");
// print StratumSection
out.append("*S JSP\n");
// print FileSection
out.append("*F\n"); int bound = fileNameList.size(); for (int i = 0; i < bound; i++) { if (filePathList.get(i) != null) {
out.append("+ " + i + " " + fileNameList.get(i) + "\n"); // Source paths must be relative, not absolute, so we // remove the leading "/", if one exists.
String filePath = filePathList.get(i); if (filePath.startsWith("/")) {
filePath = filePath.substring(1);
}
out.append(filePath + "\n");
} else {
out.append(i + " " + fileNameList.get(i) + "\n");
}
}
// print LineSection
out.append("*L\n");
bound = lineData.size(); for (int i = 0; i < bound; i++) {
LineInfo li = lineData.get(i);
out.append(li.getString());
}
// end the SMAP
out.append("*E\n");
return out.toString();
}
public SmapInput getInputLineNumber(int outputLineNumber) { // For a given Java line number, provide the associated line number // in the JSP/tag source int inputLineNumber = -1; int fileId = 0;
for (LineInfo lineInfo : lineData) { if (lineInfo.lineFileIDSet) {
fileId = lineInfo.lineFileID;
} if (lineInfo.outputStartLine > outputLineNumber) { // Didn't find match break;
}
if (lineInfo.getMaxOutputLineNumber() < outputLineNumber) { // Too early continue;
}
// This is the match int inputOffset =
(outputLineNumber - lineInfo.outputStartLine) / lineInfo.outputLineIncrement;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.