/* * Copyright 2015 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.template.soy.base.internal; import com.google.common.base.Preconditions; import com.google.template.soy.base.SourceLocation; import com.google.template.soy.base.SoySyntaxException; /* * Copyright 2015 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import javax.annotation.Nullable; /** * A SoySyntaxException that is meant for internal use in Soy. For example, for aborting execution * of a visitor in a compiler pass. * * <p>Errors should generally be reported via the ErrorReporter rather than these exceptions. */ public class LegacyInternalSyntaxException extends SoySyntaxException { /** * <p> Important: Do not use outside of Soy code (treat as superpackage-private). * * @param message The error message. * @return The new SoySyntaxException object. * @deprecated Prefer {@link LegacyInternalSyntaxException#createWithMetaInfo}. There's no good * reason for not knowing where an error comes from. */ @Deprecated public static LegacyInternalSyntaxException createWithoutMetaInfo(String message) { return new LegacyInternalSyntaxException(message); } /** * <p> Important: Do not use outside of Soy code (treat as superpackage-private). * * @param message The error message. * @param srcLoc The source location of the error, or null if unknown. At most one of srcLoc and * filePath may be nonnull (prefer srcLoc since it contains more info). * @param filePath The file path of the file containing the error. At most one of srcLoc and * filePath may be nonnull (prefer srcLoc since it contains more info). * @param templateName The name of the template containing the error, or null if not available. * @return The new SoySyntaxException object. */ public static LegacyInternalSyntaxException createWithMetaInfo( String message, @Nullable SourceLocation srcLoc, @Nullable String filePath, @Nullable String templateName) { return createWithoutMetaInfo(message).associateMetaInfo(srcLoc, filePath, templateName); } /** * <p> Important: Do not use outside of Soy code (treat as superpackage-private). * * @param message The error message. * @param srcLoc The source location of the error, or null if unknown. * @return The new SoySyntaxException object. */ public static LegacyInternalSyntaxException createWithMetaInfo( String message, SourceLocation srcLoc) { return createWithoutMetaInfo(message) .associateMetaInfo(srcLoc, null /* filePath */, null /* templateName */); } /** The location in the soy file at which the error occurred. */ protected SourceLocation srcLoc = SourceLocation.UNKNOWN; /** The name of the template with the syntax error if any. */ protected String templateName; protected LegacyInternalSyntaxException(Throwable cause) { super(cause); } protected LegacyInternalSyntaxException(String message, Throwable cause) { super(message, cause); } protected LegacyInternalSyntaxException(String message) { super(message); } public LegacyInternalSyntaxException associateMetaInfo( @Nullable SourceLocation srcLoc, @Nullable String filePath, @Nullable String templateName) { if (srcLoc != null) { Preconditions.checkArgument(filePath == null); // srcLoc and filePath can't both be nonnull // If srcLoc not yet set, then set it, else assert existing value equals new value. if (this.srcLoc == SourceLocation.UNKNOWN) { this.srcLoc = srcLoc; } else { Preconditions.checkState(this.srcLoc.equals(srcLoc)); } } if (filePath != null) { // If srcLoc not yet set, then set it (with line number -1), else assert existing file path // equals new file path. if (this.srcLoc == SourceLocation.UNKNOWN) { this.srcLoc = new SourceLocation(filePath); } else { Preconditions.checkState(this.srcLoc.getFilePath().equals(filePath)); } } if (templateName != null) { // If templateName not yet set, then set it, else assert existing value equals new value. if (this.templateName == null) { this.templateName = templateName; } else { Preconditions.checkState(this.templateName.equals(templateName)); } } return this; } /** * The source location at which the error occurred or {@link SourceLocation#UNKNOWN}. */ public SourceLocation getSourceLocation() { return srcLoc; } /** Returns the original exception message, without any source location formatting. */ public String getOriginalMessage() { return super.getMessage(); } @Override public String getMessage() { boolean locationKnown = srcLoc.isKnown(); boolean templateKnown = templateName != null; String message = super.getMessage(); if (locationKnown) { if (templateKnown) { return "In file " + srcLoc + ", template " + templateName + ": " + message; } else { return "In file " + srcLoc + ": " + message; } } else if (templateKnown) { return "In template " + templateName + ": " + message; } else { return message; } } }