update copyright
[fedora-idea.git] / xml / impl / src / com / intellij / lexer / XmlHighlightingLexer.java
blobe4857748841fdb7491c076f4aa8c625448388ae1
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.intellij.lexer;
18 import com.intellij.psi.tree.IElementType;
19 import com.intellij.psi.xml.XmlTokenType;
21 /**
22 * @author mike
24 public class XmlHighlightingLexer extends DelegateLexer {
25 public XmlHighlightingLexer() {
26 super(new XmlLexer());
29 public IElementType getTokenType() {
30 IElementType tokenType = getDelegate().getTokenType();
32 if (tokenType == null) return tokenType;
34 int state = getState() & 0xF;
36 tokenType = fixWrongTokenTypes(tokenType, state);
37 if (tokenType != XmlTokenType.XML_COMMENT_CHARACTERS &&
38 tokenType != XmlTokenType.XML_COMMENT_END &&
39 tokenType != XmlTokenType.XML_COMMENT_START &&
40 tokenType != XmlTokenType.XML_ATTRIBUTE_VALUE_START_DELIMITER) {
42 // TODO: do not know when this happens!
43 switch (state) {
44 case __XmlLexer.DOCTYPE:
45 tokenType = XmlTokenType.XML_DECL_START;
46 break;
50 return tokenType;
53 static IElementType fixWrongTokenTypes(IElementType tokenType, final int state) {
54 if (tokenType == XmlTokenType.XML_NAME) {
55 if (state == __XmlLexer.TAG || state == __XmlLexer.END_TAG) {
56 // translate XML names for tags into XmlTagName
57 tokenType = XmlTokenType.XML_TAG_NAME;
59 } else if (tokenType == XmlTokenType.XML_WHITE_SPACE) {
60 switch (state) {
61 case __XmlLexer.ATTR_LIST:
62 case __XmlLexer.ATTR:
63 tokenType = XmlTokenType.TAG_WHITE_SPACE; break;
64 default:
65 tokenType = XmlTokenType.XML_REAL_WHITE_SPACE; break;
67 } else if (tokenType == XmlTokenType.XML_CHAR_ENTITY_REF ||
68 tokenType == XmlTokenType.XML_ENTITY_REF_TOKEN
69 ) {
70 if (state == __XmlLexer.COMMENT) return XmlTokenType.XML_COMMENT_CHARACTERS;
72 return tokenType;