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