boolean foundTagEnd = false;
boolean putTokenBack = false; // This is a pre-falcon algorithm that helped recover from tag nesting errors
// I am bringing it back to life
while (tokenIterator.hasNext() && !foundTagEnd)
{
MXMLToken token = tokenIterator.next();
MXMLTagAttributeData attribute = null;
switch (token.getType())
{
case MXMLTokenTypes.TOKEN_NAME:
if (nameType == MXMLTokenTypes.TOKEN_CLOSE_TAG_START)
{
problems.add(new SyntaxProblem(token));
//burn forward until the end tag
//TODO do we want to mark each token as an error, or just the first?
while (tokenIterator.hasNext() && !foundTagEnd)
{
token = tokenIterator.next();
switch (token.getType())
{
case MXMLTokenTypes.TOKEN_TAG_END:
case MXMLTokenTypes.TOKEN_EMPTY_TAG_END:
foundTagEnd = true;
break;
}
}
break;
}
if (token.getText().startsWith("xmlns"))
{
attribute = new MXMLNamespaceAttributeData(token, tokenIterator, dialect, spec, problems);
if (map == null)
map = new MutablePrefixMap();
map.add(((IMXMLNamespaceAttributeData)attribute).getNamespacePrefix(), ((IMXMLNamespaceAttributeData)attribute).getNamespace());
}
else
{
attribute = new MXMLTagAttributeData(token, tokenIterator, dialect, spec, problems);
}
attribute.setParent(this);
// add the attribute to the attributes list even if it is duplicate
// otherwise code-hinting will not work properly
if (attributeMap.containsKey(token.getText()))
{
MXMLDuplicateAttributeProblem problem = new MXMLDuplicateAttributeProblem(attribute);
problems.add(problem);
}
attrs.add(attribute);
attributeMap.put(token.getText(), attribute);
// Now advance the offsets to include the newly parsed attributes
contentEnd = attribute.getAbsoluteEnd();
setTagOffsets(startOffset, contentEnd, nameStart, contentEnd);
break;
case MXMLTokenTypes.TOKEN_TAG_END:
foundTagEnd = true;
explicitCloseToken = !token.isImplicit();
break;
case MXMLTokenTypes.TOKEN_EMPTY_TAG_END:
emptyTag = true;
explicitCloseToken = !token.isImplicit();
foundTagEnd = true;
break;
case MXMLTokenTypes.TOKEN_OPEN_TAG_START:
case MXMLTokenTypes.TOKEN_CLOSE_TAG_START:
problems.add(new SyntaxProblem(token));
foundTagEnd = true; // Don't keep going - bail from malformed tag
putTokenBack = true;
// if we added this.fEmptyTag = true; then we could repair the damage here,
// but it's better to let the balancer repair it (in case there is a matching close lurking somewhere)
break;
default:
problems.add(new SyntaxProblem(token));
break;
}
if (foundTagEnd)
{
if (token.isImplicit() && token.getStart() == -1)
{
explicitCloseToken = false;
//let's try to end at the start of the next token if one exists
if (tokenIterator.hasNext())
{
MXMLToken next = tokenIterator.next();
if (next != null)
{
// extend the end, but not the content end
setTagOffsets(getAbsoluteStart() == -1 ? next.getStart() : getAbsoluteStart(), getAbsoluteEnd() == -1 ? next.getStart() : getAbsoluteEnd(), nameStart == -1 ? next.getStart() : nameStart, contentEnd == -1 ? next.getStart() : contentEnd);
tokenIterator.previous();
}
}
else
{