001/* 002 * Copyright 2010-2013 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 017package org.jetbrains.jet.cli.common.messages; 018 019import com.google.common.collect.LinkedHashMultimap; 020import com.google.common.collect.Multimap; 021import org.jetbrains.annotations.NotNull; 022 023import java.util.Collection; 024 025public class GroupingMessageCollector implements MessageCollector { 026 027 private final MessageCollector delegate; 028 029 // File path (nullable) -> message 030 private final Multimap<String, Message> groupedMessages = LinkedHashMultimap.create(); 031 032 public GroupingMessageCollector(@NotNull MessageCollector delegate) { 033 this.delegate = delegate; 034 } 035 036 @Override 037 public void report( 038 @NotNull CompilerMessageSeverity severity, 039 @NotNull String message, 040 @NotNull CompilerMessageLocation location 041 ) { 042 if (CompilerMessageSeverity.VERBOSE.contains(severity)) { 043 delegate.report(severity, message, location); 044 } 045 else { 046 groupedMessages.put(location.getPath(), new Message(severity, message, location)); 047 } 048 } 049 050 public void flush() { 051 for (String path : groupedMessages.keySet()) { 052 Collection<Message> messages = groupedMessages.get(path); 053 for (Message message : messages) { 054 delegate.report(message.severity, message.message, message.location); 055 } 056 } 057 groupedMessages.clear(); 058 } 059 060 private static class Message { 061 private final CompilerMessageSeverity severity; 062 private final String message; 063 private final CompilerMessageLocation location; 064 065 private Message(@NotNull CompilerMessageSeverity severity, @NotNull String message, @NotNull CompilerMessageLocation location) { 066 this.severity = severity; 067 this.message = message; 068 this.location = location; 069 } 070 071 @Override 072 public boolean equals(Object o) { 073 if (this == o) return true; 074 if (o == null || getClass() != o.getClass()) return false; 075 076 Message message1 = (Message) o; 077 078 if (!location.equals(message1.location)) return false; 079 if (!message.equals(message1.message)) return false; 080 if (severity != message1.severity) return false; 081 082 return true; 083 } 084 085 @Override 086 public int hashCode() { 087 int result = severity.hashCode(); 088 result = 31 * result + message.hashCode(); 089 result = 31 * result + location.hashCode(); 090 return result; 091 } 092 } 093}