001 /* 002 * Copyright 2010-2015 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.jetbrains.kotlin.diagnostics.rendering; 018 019 import com.intellij.psi.PsiElement; 020 import org.jetbrains.annotations.NotNull; 021 import org.jetbrains.annotations.Nullable; 022 import org.jetbrains.kotlin.diagnostics.*; 023 import org.jetbrains.kotlin.renderer.MultiRenderer; 024 import org.jetbrains.kotlin.renderer.Renderer; 025 026 import java.util.HashMap; 027 import java.util.Map; 028 029 public final class DiagnosticFactoryToRendererMap { 030 private final Map<DiagnosticFactory<?>, DiagnosticRenderer<?>> map = new HashMap<DiagnosticFactory<?>, DiagnosticRenderer<?>>(); 031 private boolean immutable = false; 032 033 // TO catch EA-75872 034 private final String name; 035 public DiagnosticFactoryToRendererMap(String name) { 036 this.name = name; 037 } 038 public DiagnosticFactoryToRendererMap() { 039 this("<unnamed>"); 040 } 041 @Override 042 public String toString() { 043 return "DiagnosticFactory#" + name; 044 } 045 // 046 047 private void checkMutability() { 048 if (immutable) { 049 throw new IllegalStateException("factory to renderer map is already immutable"); 050 } 051 } 052 053 public <E extends PsiElement> void put(@NotNull DiagnosticFactory0<E> factory, @NotNull String message) { 054 checkMutability(); 055 map.put(factory, new SimpleDiagnosticRenderer(message)); 056 } 057 058 public <E extends PsiElement, A> void put(@NotNull DiagnosticFactory1<E, A> factory, @NotNull String message, @Nullable Renderer<? super A> rendererA) { 059 checkMutability(); 060 map.put(factory, new DiagnosticWithParameters1Renderer<A>(message, rendererA)); 061 } 062 063 public <E extends PsiElement, A> void put(@NotNull DiagnosticFactory1<E, A> factory, @NotNull String message, @NotNull MultiRenderer<? super A> rendererA) { 064 checkMutability(); 065 map.put(factory, new DiagnosticWithMultiParametersRenderer<A>(message, rendererA)); 066 } 067 068 public <E extends PsiElement, A, B> void put(@NotNull DiagnosticFactory2<E, A, B> factory, 069 @NotNull String message, 070 @Nullable Renderer<? super A> rendererA, 071 @Nullable Renderer<? super B> rendererB) { 072 checkMutability(); 073 map.put(factory, new DiagnosticWithParameters2Renderer<A, B>(message, rendererA, rendererB)); 074 } 075 076 public <E extends PsiElement, A, B, C> void put(@NotNull DiagnosticFactory3<E, A, B, C> factory, 077 @NotNull String message, 078 @Nullable Renderer<? super A> rendererA, 079 @Nullable Renderer<? super B> rendererB, 080 @Nullable Renderer<? super C> rendererC) { 081 checkMutability(); 082 map.put(factory, new DiagnosticWithParameters3Renderer<A, B, C>(message, rendererA, rendererB, rendererC)); 083 } 084 085 @Nullable 086 public DiagnosticRenderer<?> get(@NotNull DiagnosticFactory<?> factory) { 087 return map.get(factory); 088 } 089 090 public void setImmutable() { 091 immutable = false; 092 } 093 }