/*
 * Copyright 2017 Google Inc. All Rights Reserved.
 *
 * 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.
 */

plugins {
  id "org.jetbrains.intellij" version "1.4.0"
}

repositories {
  mavenCentral()
}

ext {
  googleJavaFormatVersion = "1.15.0"
}

apply plugin: "org.jetbrains.intellij"
apply plugin: "java"

sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11

intellij {
  pluginName = "google-java-format"
  plugins = ["java"]
  version = "221.3427-EAP-CANDIDATE-SNAPSHOT"
}

patchPluginXml {
  pluginDescription = "Formats source code using the google-java-format tool. This version of " +
                      "the plugin uses version ${googleJavaFormatVersion} of the tool."
  version.set("${googleJavaFormatVersion}.0")
  sinceBuild = "203"
  untilBuild = ""
}

publishPlugin {
  token = project.ext.properties.jetbrainsPluginRepoToken
}

sourceSets {
  main {
    java.srcDir "src"
    resources.srcDir "resources"
  }
}

dependencies {
  implementation "com.google.googlejavaformat:google-java-format:${googleJavaFormatVersion}"
}
