blob: 909cacfd114885b304695c1694a86dbc767cd905 [file] [log] [blame]
Ben Dodson920dbbb2010-08-04 15:21:06 -07001/*
2 * Copyright (C) 2010 Google Inc.
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
17package com.google.doclava;
18
19import com.google.clearsilver.jsilver.data.Data;
20
21import java.util.regex.Pattern;
22import java.util.regex.Matcher;
23
24public class AttrTagInfo extends TagInfo {
25 private static final String REF_COMMAND = "ref";
26 private static final String NAME_COMMAND = "name";
27 private static final String DESCRIPTION_COMMAND = "description";
28 private static final Pattern TEXT = Pattern.compile("(\\S+)\\s*(.*)", Pattern.DOTALL);
29 private static final Pattern NAME_TEXT = Pattern.compile("(\\S+)(.*)", Pattern.DOTALL);
30
31 private ContainerInfo mBase;
32 private String mCommand;
33
34 // if mCommand == "ref"
35 private FieldInfo mRefField;
36 private AttributeInfo mAttrInfo;
37
38 // if mCommand == "name"
39 private String mAttrName;
40
41 // if mCommand == "description"
42 private Comment mDescrComment;
43
44 AttrTagInfo(String name, String kind, String text, ContainerInfo base, SourcePositionInfo position) {
45 super(name, kind, text, position);
46 mBase = base;
47
48 parse(text, base, position);
49 }
50
51 void parse(String text, ContainerInfo base, SourcePositionInfo position) {
52 Matcher m;
53
54 m = TEXT.matcher(text);
55 if (!m.matches()) {
56 Errors.error(Errors.BAD_ATTR_TAG, position, "Bad @attr tag: " + text);
57 return;
58 }
59
60 String command = m.group(1);
61 String more = m.group(2);
62
63 if (REF_COMMAND.equals(command)) {
64 String ref = more.trim();
65 LinkReference linkRef = LinkReference.parse(ref, mBase, position, false);
66 if (!linkRef.good) {
67 Errors.error(Errors.BAD_ATTR_TAG, position, "Unresolved @attr ref: " + ref);
68 return;
69 }
70 if (!(linkRef.memberInfo instanceof FieldInfo)) {
71 Errors.error(Errors.BAD_ATTR_TAG, position, "@attr must be a field: " + ref);
72 return;
73 }
74 mCommand = command;
75 mRefField = (FieldInfo) linkRef.memberInfo;
76 } else if (NAME_COMMAND.equals(command)) {
77 m = NAME_TEXT.matcher(more);
78 if (!m.matches() || m.group(2).trim().length() != 0) {
79 Errors.error(Errors.BAD_ATTR_TAG, position, "Bad @attr name tag: " + more);
80 return;
81 }
82 mCommand = command;
83 mAttrName = m.group(1);
84 } else if (DESCRIPTION_COMMAND.equals(command)) {
85 mCommand = command;
86 mDescrComment = new Comment(more, base, position);
87 } else {
88 Errors.error(Errors.BAD_ATTR_TAG, position, "Bad @attr command: " + command);
89 }
90 }
91
92 public FieldInfo reference() {
93 return REF_COMMAND.equals(mCommand) ? mRefField : null;
94 }
95
96 @Override
97 public String name() {
98 return NAME_COMMAND.equals(mCommand) ? mAttrName : null;
99 }
100
101 public Comment description() {
102 return DESCRIPTION_COMMAND.equals(mCommand) ? mDescrComment : null;
103 }
104
105 @Override
106 public void makeHDF(Data data, String base) {
107 super.makeHDF(data, base);
108 }
109
110 public void setAttribute(AttributeInfo info) {
111 mAttrInfo = info;
112 }
113
114 public static void makeReferenceHDF(Data data, String base, AttrTagInfo[] tags) {
115 int i = 0;
116 for (AttrTagInfo t : tags) {
117 if (REF_COMMAND.equals(t.mCommand)) {
118 if (t.mAttrInfo == null) {
119 String msg = "ERROR: unlinked attr: " + t.mRefField.name();
120 if (false) {
121 System.out.println(msg);
122 } else {
123 throw new RuntimeException(msg);
124 }
125 } else {
126 data.setValue(base + "." + i + ".name", t.mAttrInfo.name());
127 data.setValue(base + "." + i + ".href", t.mAttrInfo.htmlPage());
128 i++;
129 }
130 }
131 }
132 }
133
134}