/** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.litho.specmodels.processor; import javax.annotation.Nullable; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import com.facebook.litho.specmodels.internal.ImmutableList; import com.facebook.litho.specmodels.model.PropJavadocModel; /** * Extracts javadocs from the given input. */ public class JavadocExtractor { private static final Pattern JAVADOC_SANITIZER = Pattern.compile("^\\s", Pattern.MULTILINE); /** * Get the class javadoc from the given {@link TypeElement}. */ @Nullable static String getClassJavadoc(Elements elements, TypeElement typeElement) { final String unsanitizedJavadoc = elements.getDocComment(typeElement); if (unsanitizedJavadoc == null || unsanitizedJavadoc.isEmpty()) { return null; } final String javadoc = JAVADOC_SANITIZER.matcher(unsanitizedJavadoc).replaceAll(""); final int firstPropJavadocIndex = javadoc.indexOf("@prop "); return firstPropJavadocIndex < 0 ? javadoc : javadoc.substring(0, firstPropJavadocIndex); } static ImmutableList<PropJavadocModel> getPropJavadocs( Elements elements, TypeElement typeElement) { final String unsanitizedJavadoc = elements.getDocComment(typeElement); if (unsanitizedJavadoc == null || unsanitizedJavadoc.isEmpty()) { return ImmutableList.of(); } final String javadoc = JAVADOC_SANITIZER.matcher(unsanitizedJavadoc).replaceAll(""); final String[] propJavadocs = javadoc.split("@prop "); final List<PropJavadocModel> propJavadocModels = new ArrayList<>(propJavadocs.length); for (int i = 1, size = propJavadocs.length; i < size; i++) { final String propJavadoc = propJavadocs[i]; // Each prop comment line look like: // @prop propName comment for the prop. final String[] propJavadocContents = propJavadoc.split(" ", 2); if (propJavadocContents.length == 2) { propJavadocModels.add( new PropJavadocModel( propJavadocContents[0], propJavadocContents[1].replace('\n', ' '))); } } return ImmutableList.copyOf(propJavadocModels); } }