| /******************************************************************************* |
| * Copyright (c) 2011 xored software, Inc. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * xored software, Inc. - initial API and Implementation (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.javascript.parser.jsdoc; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.dltk.utils.ArrayIterator; |
| |
| public class JSDocTags implements Iterable<JSDocTag> { |
| |
| public static final JSDocTags EMPTY = new JSDocTags(new JSDocTag[0]); |
| |
| private final JSDocTag[] tags; |
| |
| public JSDocTags(JSDocTag[] tags) { |
| this.tags = tags; |
| } |
| |
| /** |
| * Returns all the jsdoc tags. |
| * |
| * @param tagName |
| * @return |
| */ |
| public List<JSDocTag> list() { |
| return Arrays.asList(tags); |
| } |
| |
| /** |
| * Return 1st tag with the specified name or <code>null</code> |
| * |
| * @param tagName |
| * @return |
| */ |
| public JSDocTag get(String tagName) { |
| for (JSDocTag tag : tags) { |
| if (tagName.equals(tag.name())) { |
| return tag; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Return 1st tag with one of the specified names or <code>null</code> |
| * |
| * @param tagName |
| * @return |
| */ |
| public JSDocTag get(String[] tagNames) { |
| for (JSDocTag tag : tags) { |
| for (String tagName : tagNames) { |
| if (tagName.equals(tag.name())) { |
| return tag; |
| } |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Returns all tags with the specified name. If there are no matching tags |
| * the empty list is returned. |
| * |
| * @param tagName |
| * @return |
| */ |
| public List<JSDocTag> list(String tagName) { |
| List<JSDocTag> result = null; |
| for (JSDocTag tag : tags) { |
| if (tagName.equals(tag.name())) { |
| if (result == null) { |
| result = new ArrayList<JSDocTag>(); |
| } |
| result.add(tag); |
| } |
| } |
| return result != null ? result : Collections.<JSDocTag> emptyList(); |
| } |
| |
| /** |
| * Returns all tags with the specified names. If there are no matching tags |
| * the empty list is returned. |
| * |
| * @param tagNames |
| * @return |
| */ |
| public List<JSDocTag> list(String[] tagNames) { |
| List<JSDocTag> result = null; |
| for (JSDocTag tag : tags) { |
| for (String tagName : tagNames) { |
| if (tagName.equals(tag.name())) { |
| if (result == null) { |
| result = new ArrayList<JSDocTag>(); |
| } |
| result.add(tag); |
| break; |
| } |
| } |
| } |
| return result != null ? result : Collections.<JSDocTag> emptyList(); |
| } |
| |
| public int size() { |
| return tags.length; |
| } |
| |
| public boolean isEmpty() { |
| return tags.length == 0; |
| } |
| |
| public JSDocTag get(int index) { |
| return tags[index]; |
| } |
| |
| /** |
| * Returns the number of tags with the specified name. |
| * |
| * @param tagName |
| * @return |
| */ |
| public int count(String tagName) { |
| int result = 0; |
| for (JSDocTag tag : tags) { |
| if (tagName.equals(tag.name())) { |
| ++result; |
| } |
| } |
| return result; |
| } |
| |
| /** |
| * Returns the number of the tags with the specified names. |
| * |
| * @param tagName |
| * @return |
| */ |
| public int count(String[] tagNames) { |
| int result = 0; |
| for (JSDocTag tag : tags) { |
| for (String tagName : tagNames) { |
| if (tagName.equals(tag.name())) { |
| ++result; |
| break; |
| } |
| } |
| } |
| return result; |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder sb = new StringBuilder(); |
| sb.append('['); |
| boolean first = true; |
| for (JSDocTag tag : tags) { |
| if (!first) { |
| sb.append(",\n "); |
| } else { |
| first = false; |
| } |
| sb.append(tag); |
| } |
| sb.append(']'); |
| return sb.toString(); |
| } |
| |
| public Iterator<JSDocTag> iterator() { |
| return new ArrayIterator<JSDocTag>(tags); |
| } |
| |
| public JSDocTag getTagAt(int offset) { |
| for (JSDocTag tag : tags) { |
| if (tag.start() <= offset && tag.end() >= offset) { |
| return tag; |
| } |
| } |
| return null; |
| } |
| |
| } |