/* * Copyright 2003-2016 JetBrains s.r.o. * * 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 jetbrains.mps.generator.impl.query; import jetbrains.mps.generator.impl.GenerationFailureException; import jetbrains.mps.generator.template.ReferenceMacroContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Unlike {@link PropertyValueQuery}, this one doesn't tell its link or default resolve info (which could be easily generated from template model). * First of all, it's not possible from API perspective (for RTQ, we need association link prior to evaluate to populate RMC, while evaluate is our only way to * figure out query is missing. Second, it's little value in the association link at all (much like PVQ.getProperty(), too) - for interpreted templates, I need * to find appropriate meta object anyway (in TemplateNode; to figure out which property/link to copy or to process with a macro), for generated, code * to set property/reference would be generated right in the template code. * There's indeed use for detault value (both for reference and property), and this shall be added here. However, I don't want to do it right away * (Until {@link jetbrains.mps.generator.impl.interpreted.ReflectiveQueryProvider} knows its template model and can find nodes by QueryKey, I'd need to pass * this default value through QK, which I don't think is nice). Although even in that case there might be too much magic - if QK identifies a macro node, I'd * need to go to parent to find out defaultReferenceInfo value, while in TemplateNode everything is already there. * * @author Artem Tikhomirov * @since 3.4 */ public interface ReferenceTargetQuery extends Query { @Nullable Object evaluate(@NotNull ReferenceMacroContext ctx) throws GenerationFailureException; abstract class Base implements ReferenceTargetQuery { // TODO expose in API and utlize in TemplateNode private String myDefaultResolveInfo; protected Base() { } protected Base(String defaultResolveInfo) { myDefaultResolveInfo = defaultResolveInfo; } } }