/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* See LICENSE.txt included in this distribution for the specific
* language governing permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Portions Copyright 2011, 2012 Jens Elkner.
*/
/**
* Base class for Xref lexers.
*
* @author Lubos Kosco
*/
public abstract class JFlexXref {
/** Where to write xref content. */
/** URL prefix to use when generating search URLs. Per default this is
* {@link Configuration#getUrlPrefix()}.*/
/** Annotation to use when writing out annotation info.*/
/** The project, to which this instance is related to. */
/** symbol definitions to use when writing out related info */
/**
* A stack of <span ...> CSS class names currently opened.
* It is used to close all open spans for a line and re-open them at the
* start of the next line to produce wellformed XML. So if a
* <span ...> is opened and do not closed on the same line, the class
* name used needs to be pushed onto this stack. If the <span ...>
* gets closed on a different line, it needs to be popped from this stack.
* If properly done, the stack should be empty when the last line has been
* written.
*/
@SuppressWarnings("serial")
/**
* Create a new empty instance with the default capacity.
*/
public SpanStack() {
super();
}
/**
* The preferred method to add a new span class name to this instance.
* @param s class name to add.
* @see #pop()
* @throws IllegalArgumentException if the given argument is {@code null}.
*/
if (s == null) {
throw new IllegalArgumentException("null is not allowed");
}
super.add(s);
}
/**
* The preferred method to remove the last element from this stack.
* @return {@code null} if the stack is empty, the removed element
* otherwise.
* @see #push(String)
*/
}
}
/** the {@link SpanStack} for this and only this instance */
/** EOF value returned by yylex(). */
private final int yyeof;
/** See {@link Configuration#getUserPage()}. Per default initialized
* in the constructor and here to be consistent and avoid lot of
* unnecessary lookups.
* @see #startNewLine() */
/** See {@link Configuration#getUserPageSuffix()}. Per default
* initialized in the constructor and here to be consistent and avoid lot of
* unnecessary lookups.
* @see #startNewLine() */
/** Stack to remember the order of relevant states for the current parser.
* @see #labelStack */
/** Stack to remember the order of relevant state related labels for the
* current parser. To keep consistency, {@link #stateStack} opertions should
* always performed accordingly to this instance (i.e. if you wanna pop,
* pop both, etc. ;-))! */
/**
* Description of the style to use for a type of definitions.
*/
private static class Style {
/** Name of the style definition as given by CTags. */
/** Class name used by the style sheets when rendering the xref. */
/**
* The title of the section to which this type belongs, or {@code null}
* if this type should not be listed in the navigation panel.
*/
/** Construct a style description. */
}
}
/**
* Description of styles to use for different types of definitions.
*/
};
/**
* Create a new lexer instance. Initializes {@link #userPageLink},
* {@link #userPageSuffix} using the runtime environment and creates a new
* empty {@link SpanStack}.
* @see Configuration#getUserPage()
* @see Configuration#getUserPageSuffix()
*/
protected JFlexXref() {
try {
// TODO when bug #16053 is fixed, we should add a getter to a file
// that's included from all the Xref classes so that we avoid the
// reflection.
userPageLink = null;
}
}
} catch (Exception e) {
// The auto-generated constructors for the Xref classes don't
// expect a checked exception, so wrap it in an AssertionError.
// This should never happen, since all the Xref classes will get
// a public static YYEOF field from JFlex.
throw ae; // NOPMD (stack trace is preserved by initCause(), but
// PMD thinks it's lost)
}
}
/**
* Reinitialize the xref with new contents.
*
* @param contents a char buffer with text to analyze
* @param length the number of characters to use from the char buffer
*/
annotation = null;
}
/**
* Set the symbol defintions to use when writing out related info.
* @param defs symbol definitions to use. Might be {@code null}.
*/
}
/**
* Write out the URL parameter, which specifies the project to use. Does
* nothing if {@link #project} is not set.
* @throws IOException
*/
}
}
/**
* Get the URL parameter, which specifies the project to use.
* @return an empty String if {@link #project} is not set, the parameter
* including the leading & otherwise.
*/
}
/**
* Run the scanner to get the next token from the input.
* @throws IOException */
/**
* Closes the current input stream, and resets the scanner to read from the
* given input stream. All internal variables are reset, the old input
* stream cannot be reused (content of the internal buffer is discarded and
* lost). The lexical state is set to {@code YY_INITIAL}.
* @param reader the new input stream to operate on.*/
/**
* Get the number of the current line of input (which is usually the same as
* {@code yyline}).
* @return a value >= 0.
*/
protected abstract int getLineNumber();
/**
* Set the number of the current line of input (which is usually the same as
* {@code yyline}).
* @param line line number to set. */
/**
* Enter the given lexical state.
* @param newState state to enter
*/
/**
* Get the current lexical state of the scanner.
* @return a lexical state.
*/
public abstract int yystate();
/**
* Write the crossfile content to the specified {@code Writer}.
*
* @param out xref destination
* @throws IOException on error when writing the xref
*/
setLineNumber(0);
startNewLine();
// nothing to do here, yylex() will do the work
}
finishLine();
+ " lexer is not perfect yet!");
}
}
/**
* Write a JavaScript function that returns an array with the definitions
* to list in the navigation panel. Each element of the array is itself an
* array containing the name of the definition type, the CSS class name for
* the type, and an array of (symbol, line) pairs for the definitions of
* that type.
*/
// No definitions, no symbol table to write
return;
}
// We want the symbol table to be sorted
// Order by symbol name, and then by line number if multiple
// definitions use the same symbol name
if (ret == 0) {
}
return ret;
}
};
}
}
}
boolean first = true;
if (!first) {
}
boolean firstTag = true;
if (!firstTag) {
}
firstTag = false;
}
first = false;
}
}
/* no LF intentionally - xml is whitespace aware ... */
}
/**
* Get the style description for a definition type.
*
* @param type the definition type
* @return the style of a definition type, or {@code null} if no style is
* defined for the type
* @see #DEFINITION_STYLES
*/
return style;
}
}
return null;
}
/**
* Write out annotation infos for the given line.
*
* @param num linenumber to print
* @throws IOException depends on the destination (<var>out</var>).
*/
}
if (userPageLink == null) {
} else {
if (userPageSuffix != null) {
}
}
}
}
}
}
}
/**
* Terminate the current line and insert preamble for the next line. The
* line count will be incremented.
*
* @throws IOException on error when writing the xref
*/
int line = getLineNumber();
if (line != 0) {
finishLine();
}
setLineNumber(++line);
/* <div id="N">...</div>
* -> uncompressed size ~6%, compressed size ~26% bigger;
* <div id="N"><b>N</b>...</div>
* -> uncompressed size ~12%, compressed size ~52% bigger;
* <span class="[h]l" id="N">N</span>...
* -> is about the same as previous one
*/
if (annotation != null) {
}
} else {
}
}
}
}
/**
* Write a symbol and generate links as appropriate.
*
* @param symbol the symbol to write.
* @param keywords a set of keywords recognized by this analyzer (no links
* will be generated if the symbol is a keyword)
* @param line the line number on which the symbol appears
* @param escape If {@code true} <var>symbol</var> gets escapes for URI paths
* and html text. Otherwise it is assumed, that symbol contains no HTML
* special characters.
* @throws IOException if an error occurs while writing to the stream
*/
boolean escape) throws IOException
{
// This is a keyword, so we don't create a link.
// This is the definition of the symbol.
}
// 1) Create an anchor for direct links. (Perhaps we should only
// do this when there's exactly one definition of the symbol in
// this file? Otherwise, we may end up with multiple anchors with
// the same name.)
// 2) Create a link that searches for all references to this symbol.
// This is a reference to a symbol defined exactly once in this file.
// Generate a direct link to the symbol definition.
} else {
// This is a symbol that is not defined in this file, or a symbol
// that is defined more than once in this file. In either case, we
// can't generate a direct link to the definition, so generate a
// link to search for all definitions of that symbol instead.
}
}
/**
* Write out the Unicode character, unless it's an ISO control character
* < 0x20, in which case it is ignored.
*
* @param c the character to write
* @throws IOException if an error occurs while writing to the stream
*/
if (c > 0x20) {
}
}
/**
* Write an e-mail address. The address will be obfuscated if
* {@link Configuration#isObfuscatingEMailAddresses()} returns
* {@code true}. It gets not htmlized because it is assumed to contain no
* HTML special characters.
*
* @param address the address to write
* @throws IOException if an error occurs while writing to the stream
*/
} else {
}
}
/**
* Push the current state to the state order stack, the given label to the
* {@link #labelStack} and enter the given state.
* @param newState new state to enter.
* @param label label to push to the {@link #labelStack}. Might be {@code null}.
* @see #stateStack
* @see #yystate()
* @see #yybegin(int)
*/
@SuppressWarnings("boxing")
}
/**
* Pop the last entry from the state order stack and enter it. Also pop the
* the last label from the {@link #labelStack} and write it out, if it is
* not {@code null}.
* @throws IOException
* @see #stateStack
* @see #yybegin(int)
*/
@SuppressWarnings("boxing")
}
}