From c2b35d6f77efd9bb56ee87001c742dbfbd779fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Mon, 16 Jul 2018 03:04:44 +0200 Subject: [PATCH 001/115] Scroll bar less conversion --- .../pmd/util/fxdesigner/less/designer.less | 88 ++++++++++--------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less index a6d2724de8..b9bb7415d6 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less @@ -253,54 +253,58 @@ /* Scroll bars */ /***************/ -.scroll-bar * { - -fx-background-color: white; -} -scroll-bar .increment-button, -scroll-bar .decrement-button { - -fx-background-radius: 0em; -} +.scroll-bar { -scroll-bar:horizontal .increment-button, -scroll-bar:horizontal .decrement-button { - -fx-padding: 0 0 10 0; -} + * { + -fx-background-color: white; + } -scroll-bar:vertical .increment-button, -scroll-bar:vertical .decrement-button { - -fx-padding: 0 10 0 0; -} + .track { + -fx-border-color: white; + -fx-background-radius: 0em; + -fx-border-radius: 2em; + -fx-padding: -2; + } -.scroll-bar .decrement-arrow, -.scroll-bar .increment-arrow { - -fx-shape: " "; - -fx-padding: 0; -} + .thumb { + -fx-background-color: derive(black, 90%); + -fx-background-insets: 2, 0, 0; + -fx-background-radius: 2em; + } -.scroll-bar .track { - -fx-border-color: white; - -fx-background-radius: 0em; - -fx-border-radius: 2em; - -fx-padding: -2; -} + .increment-button, .decrement-button { + -fx-background-radius: 0em; + } -.scroll-bar .thumb { - -fx-background-color: derive(black, 90%); - -fx-background-insets: 2, 0, 0; - -fx-background-radius: 2em; -} + .increment-arrow, .decrement-arrow { + -fx-shape: " "; + -fx-padding: 0; + } -.scroll-bar:vertical, -.scroll-bar:vertical > * { - -fx-min-width: 15px; - -fx-pref-width: 15px; - -fx-max-width: 15px; -} + &:horizontal { -.scroll-bar:horizontal, -.scroll-bar:horizontal > * { - -fx-min-height: 15px; - -fx-pref-height: 15px; - -fx-max-height: 15px; + &, & > * { + -fx-min-height: 15px; + -fx-pref-height: 15px; + -fx-max-height: 15px; + } + + .increment-button, .decrement-button { + -fx-padding: 0 0 10 0; + } + } + + &:vertical { + + &, & > * { + -fx-min-width: 15px; + -fx-pref-width: 15px; + -fx-max-width: 15px; + } + + .increment-button, .decrement-button { + -fx-padding: 0 10 0 0; + } + } } From 829351cad76aa4a28bcb35c448cd8395cad0327a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Mon, 16 Jul 2018 03:09:16 +0200 Subject: [PATCH 002/115] Tab pane less conversion --- .../pmd/util/fxdesigner/less/designer.less | 102 +++++++++--------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less index b9bb7415d6..750eb43e9a 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less @@ -182,71 +182,71 @@ /* Tab pane */ /************/ -.tab-pane { - -fx-tab-min-height: 20px; - -fx-tab-max-height: 20px; -} - -.tab .tab-label { - -fx-background-color: transparent; - -fx-alignment: CENTER; - -fx-padding: 0 10 0 10; -} - .tab { -fx-background-insets: 0.0; -fx-background-radius: 0.0; -fx-padding: 0 30 0 30; -fx-border-color: transparent; -fx-background-color: transparent; + + &:selected { + -fx-background-color: derive(-fx-base, -23%); + + .focus-indicator { + -fx-focus-color: transparent; + -fx-border-color: transparent; + } + } + + &:focused { + -fx-focus-color: transparent; + } + + &:disabled { + -fx-background-color: transparent; + } + + .tab-label { + -fx-background-color: transparent; + -fx-alignment: CENTER; + -fx-padding: 0 10 0 10; + } + } -.tab:selected { - -fx-background-color: derive(-fx-base, -23%); -} +.tab-pane { + -fx-tab-min-height: 20px; + -fx-tab-max-height: 20px; -.tab:focused { - -fx-focus-color: transparent; -} + &.bottom-pane-tab-pane .tab-header-area .tab:selected { + -fx-border-style: none none solid none; + -fx-border-insets: 0 0 1pt 0; + -fx-border-width: 0 0 1pt 0; + /*-fx-border-color: derive(-fx-base, -10%);*/ + } -.tab:disabled { - -fx-background-color: transparent; -} + .tab-header-area .tab-header-background { + -fx-border-style: none none solid none; + -fx-border-insets: 0 0 1pt 0; + -fx-border-width: 0 0 1pt 0; + -fx-background-color: -fx-base, derive(-fx-base, -4%); + -fx-border-color: transparent; + } -.tab-pane.bottom-pane-tab-pane .tab-header-area .tab:selected { - -fx-border-style: none none solid none; - -fx-border-insets: 0 0 1pt 0; - -fx-border-width: 0 0 1pt 0; - /*-fx-border-color: derive(-fx-base, -10%);*/ -} + .tab-header-background { + -fx-background-color: derive(-fx-base, -20%), derive(-fx-base, -10%); + } + &:top .tab-header-area { + -fx-background-insets: 0, 0 0 1 0; + -fx-padding: 0; + } -.tab-pane .tab-header-area .tab-header-background, -.menu-bar { - -fx-border-style: none none solid none; - -fx-border-insets: 0 0 1pt 0; - -fx-border-width: 0 0 1pt 0; - -fx-background-color: -fx-base, derive(-fx-base, -4%); - -fx-border-color: transparent; -} + &:left .tab-header-area { + -fx-background-insets: 0 1 0 0; + -fx-padding: 0; + } -.tab-pane .tab-header-background { - -fx-background-color: derive(-fx-base, -20%), derive(-fx-base, -10%); -} - -.tab-pane:top .tab-header-area { - -fx-background-insets: 0, 0 0 1 0; - -fx-padding: 0; -} - -.tab-pane:left *.tab-header-area { - -fx-background-insets: 0 1 0 0; - -fx-padding: 0; -} - -.tab:selected .focus-indicator { - -fx-focus-color: transparent; - -fx-border-color: transparent; } /***************/ From 6a4200e158e0bfcfdf6800cca45cc900c20f0284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Mon, 16 Jul 2018 19:41:22 +0200 Subject: [PATCH 003/115] Table view less conversion --- .../pmd/util/fxdesigner/less/designer.less | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less index 750eb43e9a..ce74dd1df8 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less @@ -11,28 +11,28 @@ .table-view { -fx-border-color: derive(-fx-base, -10%); -fx-padding: -1 0 0 0; -} -.table-view .column-header .label { - -fx-font-weight: normal; - -fx-border-color: derive(-fx-base, -10%); - -fx-font-size: 9pt; - -fx-min-height: 19pt; - -fx-max-height: 19pt; -} + .column-header { + -fx-background-color: derive(-fx-base, -10%); + -fx-border-color: derive(-fx-base, -20%); + -fx-border-style: none solid solid solid; + -fx-padding: -1 0 0 0; -.table-view .column-header { - -fx-background-color: derive(-fx-base, -10%); - -fx-border-color: derive(-fx-base, -20%); - -fx-border-style: none solid solid solid; - -fx-padding: -1 0 0 0; -} + .label { + -fx-font-weight: normal; + -fx-border-color: derive(-fx-base, -10%); + -fx-font-size: 9pt; + -fx-min-height: 19pt; + -fx-max-height: 19pt; + } + } -.table-view .show-hide-columns-button { - -fx-background-color: derive(-fx-base, -10%); - -fx-border-color: derive(-fx-base, -20%); - -fx-border-style: none solid solid solid; - -fx-padding: -1 0 0 0; + .show-hide-columns-button { + -fx-background-color: derive(-fx-base, -10%); + -fx-border-color: derive(-fx-base, -20%); + -fx-border-style: none solid solid solid; + -fx-padding: -1 0 0 0; + } } .text-area { @@ -45,11 +45,12 @@ -fx-faint-focus-color: -fx-control-inner-background; -fx-text-box-border: -fx-control-inner-background; -fx-border-width: -1; + + .content { + -fx-background-color: transparent, white, transparent, white; + } } -.text-area .content { - -fx-background-color: transparent, white, transparent, white; -} .context-menu.no-scroll-arrows { From a261c41ae7c2b5a68a2caa5fa9133efced3b32fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Tue, 17 Jul 2018 02:40:43 +0200 Subject: [PATCH 004/115] Rework everything --- .../pmd/util/fxdesigner/fxml/editor.fxml | 2 +- .../pmd/util/fxdesigner/fxml/node-info.fxml | 6 +- .../pmd/util/fxdesigner/less/constants.less | 27 +++ .../pmd/util/fxdesigner/less/designer.less | 197 ++++++------------ 4 files changed, 89 insertions(+), 143 deletions(-) diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/editor.fxml b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/editor.fxml index 26bb538fbc..3981a382ea 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/editor.fxml +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/editor.fxml @@ -37,7 +37,7 @@
- +
diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/node-info.fxml b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/node-info.fxml index 7a0559ecad..2561fb159b 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/node-info.fxml +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/node-info.fxml @@ -34,7 +34,7 @@
- +
@@ -47,7 +47,7 @@
- + @@ -71,7 +71,7 @@
-
diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/constants.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/constants.less index b85c6a66ff..1705fb6bd9 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/constants.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/constants.less @@ -2,5 +2,32 @@ App-wide color constants and such. */ +// This is repeated to use it from Less +// Prefer using it over -fx-base @fx-base: #ececec; + +// Base colors for background slates +@app-base-color: darken(@fx-base, 4%); +@app-darker-slate-color: darken(@fx-base, 14%); + +// Darker accent colors @darker-accent: darken(@fx-base, 10%); +@darker-accent-focus: darken(@fx-base, 23%); +// Not reserved to borders, I just ran out of names +@darker-accent-border: darken(@fx-base, 20%); + +@selection-focus-color: fadeout(royalblue, 20%); + +// mixin to fix the width of a component +.fix-width(@width) { + -fx-pref-width: @width; + -fx-min-width: @width; + -fx-max-width: @width; +} + +// mixin to fix the height of a component +.fix-height(@height) { + -fx-pref-height: @height; + -fx-min-height: @height; + -fx-max-height: @height; +} diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less index ce74dd1df8..bd2bebef5b 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less @@ -1,26 +1,28 @@ /* Useful links: */ /* http://hg.openjdk.java.net/openjfx/jfx-dev/rt/file/762a57e4b74a/modules/javafx.controls/src/main/resources/com/sun/javafx/scene/control/skin/modena/modena.css */ /* https://fontawesome.com/icons?d=gallery */ -/* TODO convert to Less */ + +@import "constants"; + .list-view, .tree-view, .table-view { - -fx-selection-bar: royalblue; - -fx-selection-bar-non-focused: derive(-fx-base, -20%); + -fx-selection-bar: @selection-focus-color; + -fx-selection-bar-non-focused: @darker-accent-border; } .table-view { - -fx-border-color: derive(-fx-base, -10%); + -fx-border-color: @darker-accent; -fx-padding: -1 0 0 0; .column-header { - -fx-background-color: derive(-fx-base, -10%); - -fx-border-color: derive(-fx-base, -20%); + -fx-background-color: @darker-accent; + -fx-border-color: @darker-accent-border; -fx-border-style: none solid solid solid; -fx-padding: -1 0 0 0; .label { -fx-font-weight: normal; - -fx-border-color: derive(-fx-base, -10%); + -fx-border-color: @darker-accent; -fx-font-size: 9pt; -fx-min-height: 19pt; -fx-max-height: 19pt; @@ -28,8 +30,8 @@ } .show-hide-columns-button { - -fx-background-color: derive(-fx-base, -10%); - -fx-border-color: derive(-fx-base, -20%); + -fx-background-color: @darker-accent; + -fx-border-color: @darker-accent-border; -fx-border-style: none solid solid solid; -fx-padding: -1 0 0 0; } @@ -38,7 +40,7 @@ .text-area { -fx-background-insets: 0; -fx-background-color: transparent, white, transparent, white; - -fx-background-radius: 0, 0, 0, 0; + -fx-background-radius: 0; -fx-box-border: none; -fx-focus-color: -fx-control-inner-background; @@ -62,7 +64,7 @@ } .scroll-arrow { - -fx-padding: 0 0 0 0; + -fx-padding: 0; } } @@ -71,13 +73,17 @@ /**************/ #mainHorizontalSplitPane > .split-pane-divider { - -fx-background-color: derive(-fx-base, -20%); + -fx-background-color: @darker-accent-border; +} + +.info-title-bar .label { + -fx-padding: 0 0 0 6; } .split-pane > .split-pane-divider { -fx-padding: 0; -fx-border-color: transparent; - -fx-background-color: derive(-fx-base, -10%); + -fx-background-color: @darker-accent; } .split-pane { @@ -85,22 +91,8 @@ } -.secondary-panel { - -fx-border-style: none; -} - #nodeInfoPanel { - -fx-pref-width: 300px; - -fx-max-width: 300px; - -fx-min-width: 300px; -} - -/************/ -/* Toolbars */ -/************/ - -.info-title-bar .label { - -fx-padding: 0 0 0 6; + .fix-width(300); } .titled-pane > .title, @@ -109,79 +101,58 @@ -fx-pref-height: 24.0; -fx-border-radius: 0.0; -fx-background-radius: 0.0; - -fx-background-color: derive(-fx-base, -14%); + -fx-background-color: @app-darker-slate-color; } -.titled-pane.accent-header > .title, .tool-bar.accent-header, -.tool-bar.info-title-bar, -.tool-bar.editor-tools, .split-pane.accent-header > .split-pane-divider, #main-toolbar, #main-vertical-split-pane > .split-pane-divider { - -fx-background-color: derive(-fx-base, -14%); + -fx-background-color: @app-darker-slate-color; } -.accordion .titled-pane .tool-bar { - -fx-background-color: derive(-fx-base, -15%); -} - -.accordion .titled-pane .tool-bar .button { - -fx-padding: 2 5 2 5; -} .tool-bar { - -fx-pref-height: 30px; - -fx-max-height: 30px; - -fx-min-height: 30px; + .fix-height(30); -fx-border-color: transparent; -fx-border-width: .6; + + .button, .choice-box { + -fx-background-color: @darker-accent; + -fx-border-color: @darker-accent-border; + -fx-border-radius: 3; + } + + .button { + -fx-padding: -3 5 -3 5; + } + + .choice-box { + -fx-border-radius: 3; + } } -.tool-bar .button { - -fx-padding: -3 5 -3 5; - -fx-background-color: derive(-fx-base, 10%); - -fx-border-color: derive(-fx-base, -20%); - -fx-border-radius: 3; -} - +// This is used for buttons that have just an icon and no text .button.icon-button { -fx-pref-width: 20; -fx-pref-height: 20; } -.tool-bar .choice-box { - -fx-background-color: derive(-fx-base, 10%); - -fx-border-color: derive(-fx-base, -20%); - -fx-border-radius: 3; -} - -.titled-pane.bar-sep > .title { - -fx-border-style: none none solid none; - -fx-border-width: 1; -} - - /* This is the special button to reduce the lower split pane. */ -.toggle-button:selected.expand-toggle { - -fx-shape: "M 0 0 h 7 l -3.5 4 z"; -} - .toggle-button.expand-toggle { -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; -fx-background-insets: 1 0 -1 0, 0; -fx-padding: 0.25em 0.3125em 0.25em 0.3125em; /* 3 3.75 3 3.75 */ -fx-shape: "M 0 0 h 7 l -3.5 -4 z"; - -fx-min-height: 5; - -fx-max-height: 5; - -fx-pref-height: 5; - -fx-min-width: 10; - -fx-max-width: 10; - -fx-pref-width: 10; + + .fix-height(5); + .fix-width(10); + + &:selected { + // This changes the shape to point upward + -fx-shape: "M 0 0 h 7 l -3.5 4 z"; + } } -/************/ -/* Tab pane */ -/************/ .tab { -fx-background-insets: 0.0; @@ -191,7 +162,7 @@ -fx-background-color: transparent; &:selected { - -fx-background-color: derive(-fx-base, -23%); + -fx-background-color: @darker-accent-focus; .focus-indicator { -fx-focus-color: transparent; @@ -199,14 +170,10 @@ } } - &:focused { + &:focused, &:disabled { -fx-focus-color: transparent; } - &:disabled { - -fx-background-color: transparent; - } - .tab-label { -fx-background-color: transparent; -fx-alignment: CENTER; @@ -219,27 +186,16 @@ -fx-tab-min-height: 20px; -fx-tab-max-height: 20px; - &.bottom-pane-tab-pane .tab-header-area .tab:selected { - -fx-border-style: none none solid none; - -fx-border-insets: 0 0 1pt 0; - -fx-border-width: 0 0 1pt 0; - /*-fx-border-color: derive(-fx-base, -10%);*/ - } - .tab-header-area .tab-header-background { -fx-border-style: none none solid none; -fx-border-insets: 0 0 1pt 0; -fx-border-width: 0 0 1pt 0; - -fx-background-color: -fx-base, derive(-fx-base, -4%); + -fx-background-color: @fx-base, @app-base-color; -fx-border-color: transparent; } - .tab-header-background { - -fx-background-color: derive(-fx-base, -20%), derive(-fx-base, -10%); - } - &:top .tab-header-area { - -fx-background-insets: 0, 0 0 1 0; + -fx-background-insets: 0 0 1 0; -fx-padding: 0; } @@ -247,65 +203,28 @@ -fx-background-insets: 0 1 0 0; -fx-padding: 0; } - } -/***************/ -/* Scroll bars */ -/***************/ - - +// Useful link: http://www.guigarage.com/2015/11/styling-a-javafx-scrollbar/ .scroll-bar { + -fx-padding: 0; + * { -fx-background-color: white; } - .track { - -fx-border-color: white; - -fx-background-radius: 0em; - -fx-border-radius: 2em; - -fx-padding: -2; - } - .thumb { -fx-background-color: derive(black, 90%); - -fx-background-insets: 2, 0, 0; -fx-background-radius: 2em; } - .increment-button, .decrement-button { - -fx-background-radius: 0em; - } - .increment-arrow, .decrement-arrow { -fx-shape: " "; - -fx-padding: 0; - } - - &:horizontal { - - &, & > * { - -fx-min-height: 15px; - -fx-pref-height: 15px; - -fx-max-height: 15px; - } - - .increment-button, .decrement-button { - -fx-padding: 0 0 10 0; - } - } - - &:vertical { - - &, & > * { - -fx-min-width: 15px; - -fx-pref-width: 15px; - -fx-max-width: 15px; - } - - .increment-button, .decrement-button { - -fx-padding: 0 10 0 0; - } } } + +// this is the corner when there is a horizontal and vertical scrollbar +.corner { + -fx-background-color: white; +} From 2fd179024dcefb5e36f1994353ad015a75fcaba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Tue, 17 Jul 2018 14:47:36 +0200 Subject: [PATCH 005/115] Add resource links --- .../util/codearea/UniformStyleCollection.java | 2 +- .../pmd/util/fxdesigner/less/constants.less | 19 +++++++++++++++++-- .../pmd/util/fxdesigner/less/designer.less | 6 +++--- .../util/fxdesigner/less/editor-theme.less | 16 +++++----------- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/util/codearea/UniformStyleCollection.java b/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/util/codearea/UniformStyleCollection.java index 2f844b7d1e..7a713bf57d 100644 --- a/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/util/codearea/UniformStyleCollection.java +++ b/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/util/codearea/UniformStyleCollection.java @@ -25,7 +25,7 @@ import net.sourceforge.pmd.util.fxdesigner.util.codearea.NodeStyleSpan.PositionS /** * Collection of nodes that share the same style. In case of overlap, - * the nested ones gain css classes like depth-1, depth-2, etc. A + * the nested ones gain css classes like depth-0, depth-1, etc. A * collection can be overlaid into a single span in one pass using * {@link #toSpans()}. * diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/constants.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/constants.less index 1705fb6bd9..f0895b195a 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/constants.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/constants.less @@ -1,6 +1,21 @@ /* - App-wide color constants and such. - */ + App-wide color constants and useful mixins. + + Useful resources (TODO add that to a doc page on the site): + + * Less reference (we use Less 1.7.0): + http://lesscss.org/features/ + + * JavaFX CSS reference: + https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html + + * modena.css (base JavaFX stylesheet): + http://hg.openjdk.java.net/openjfx/jfx-dev/rt/file/762a57e4b74a/modules/javafx.controls/src/main/resources/com/sun/javafx/scene/control/skin/modena/modena.css + + * Icon gallery: + https://fontawesome.com/icons?d=gallery + +*/ // This is repeated to use it from Less // Prefer using it over -fx-base diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less index bd2bebef5b..431d69247d 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less @@ -1,6 +1,6 @@ -/* Useful links: */ -/* http://hg.openjdk.java.net/openjfx/jfx-dev/rt/file/762a57e4b74a/modules/javafx.controls/src/main/resources/com/sun/javafx/scene/control/skin/modena/modena.css */ -/* https://fontawesome.com/icons?d=gallery */ +/* + * Base sheet for the whole app + */ @import "constants"; diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/editor-theme.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/editor-theme.less index aaf8d9bc74..3524ac3d5f 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/editor-theme.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/editor-theme.less @@ -1,15 +1,12 @@ -/* Presets for the editor theme and syntax highlighting. */ - -/* CSS reference of the code area: - https://github.com/FXMisc/RichTextFX/wiki/RichTextFX-CSS-Reference-Guide - - Less reference (we use Less 1.7.0): - http://lesscss.org/features/ +/* Presets for the editor theme and syntax highlighting. + * CSS reference of the code area: + https://github.com/FXMisc/RichTextFX/wiki/RichTextFX-CSS-Reference-Guide */ @import "constants"; +// Each color in this stack corresponds to a depth level in XPath colors @xpath-color-stack: rgba(249, 248, 113, 0.25), rgba(255, 199, 95, 0.4), @@ -37,6 +34,7 @@ .make-depth-classes(@depth: length(@xpath-color-stack) - 1) when (@depth >= 0) { .make-depth-classes(@depth - 1); + // the first style class is depth-0, but CSS arrays indices start at 1 @background: extract(@xpath-color-stack, @depth + 1); @border: darken(@background, 30%); @@ -76,10 +74,6 @@ -fx-background-color: @area-background-color; -fx-border-color: @area-background-color; } - - .thumb { - -fx-background-color: derive(black, 90%); - } } .paragraph-box:has-caret { From ca6a543ed1e9940ba962376ec79c2615c2229dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Wed, 18 Jul 2018 02:04:27 +0200 Subject: [PATCH 006/115] Allow length 1 identifiers in naming convention rules --- .../java/rule/codestyle/AbstractNamingConventionRule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/AbstractNamingConventionRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/AbstractNamingConventionRule.java index 292c73fde3..04b6af1d3c 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/AbstractNamingConventionRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/AbstractNamingConventionRule.java @@ -26,8 +26,8 @@ import net.sourceforge.pmd.util.StringUtil; */ abstract class AbstractNamingConventionRule extends AbstractJavaRule { - static final String CAMEL_CASE = "[a-z][a-zA-Z0-9]+"; - static final String PASCAL_CASE = "[A-Z][a-zA-Z0-9]+"; + static final String CAMEL_CASE = "[a-z][a-zA-Z0-9]*"; + static final String PASCAL_CASE = "[A-Z][a-zA-Z0-9]*"; /** The argument is interpreted as the display name, and is converted to camel case to get the property name. */ RegexPBuilder defaultProp(String name) { From cab4234a1f7c64bff2830fec6f90ef7c84c39886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Wed, 18 Jul 2018 02:28:34 +0200 Subject: [PATCH 007/115] Fix tests --- .../codestyle/xml/ClassNamingConventions.xml | 2 +- .../xml/FormalParameterNamingConventions.xml | 40 +++++++++---------- .../xml/LocalVariableNamingConventions.xml | 18 ++++----- .../codestyle/xml/MethodNamingConventions.xml | 4 +- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/ClassNamingConventions.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/ClassNamingConventions.xml index fc8767d990..0248ab34b9 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/ClassNamingConventions.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/ClassNamingConventions.xml @@ -36,7 +36,7 @@ [a-z][A-Za-z]* 1 - The class name 'foo' doesn't match '[A-Z][a-zA-Z0-9]+' + The class name 'foo' doesn't match '[A-Z][a-zA-Z0-9]*' Default is camel case 5 - The method parameter name 'Foo' doesn't match '[a-z][a-zA-Z0-9]+' - The final method parameter name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]+' - The lambda parameter name 'Koo' doesn't match '[a-z][a-zA-Z0-9]+' - The explicitly-typed lambda parameter name 'Voo' doesn't match '[a-z][a-zA-Z0-9]+' - The explicitly-typed lambda parameter name 'Ooo' doesn't match '[a-z][a-zA-Z0-9]+' + The method parameter name 'Foo' doesn't match '[a-z][a-zA-Z0-9]*' + The final method parameter name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]*' + The lambda parameter name 'Koo' doesn't match '[a-z][a-zA-Z0-9]*' + The explicitly-typed lambda parameter name 'Voo' doesn't match '[a-z][a-zA-Z0-9]*' + The explicitly-typed lambda parameter name 'Ooo' doesn't match '[a-z][a-zA-Z0-9]*' 5 The method parameter name 'Foo' doesn't match '[A-Z]+' - The final method parameter name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]+' - The lambda parameter name 'Koo' doesn't match '[a-z][a-zA-Z0-9]+' - The explicitly-typed lambda parameter name 'Voo' doesn't match '[a-z][a-zA-Z0-9]+' - The explicitly-typed lambda parameter name 'Ooo' doesn't match '[a-z][a-zA-Z0-9]+' + The final method parameter name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]*' + The lambda parameter name 'Koo' doesn't match '[a-z][a-zA-Z0-9]*' + The explicitly-typed lambda parameter name 'Voo' doesn't match '[a-z][a-zA-Z0-9]*' + The explicitly-typed lambda parameter name 'Ooo' doesn't match '[a-z][a-zA-Z0-9]*' [A-Z]+ 5 - The method parameter name 'Foo' doesn't match '[a-z][a-zA-Z0-9]+' + The method parameter name 'Foo' doesn't match '[a-z][a-zA-Z0-9]*' The final method parameter name 'Hoo' doesn't match '[A-Z]+' - The lambda parameter name 'Koo' doesn't match '[a-z][a-zA-Z0-9]+' - The explicitly-typed lambda parameter name 'Voo' doesn't match '[a-z][a-zA-Z0-9]+' - The explicitly-typed lambda parameter name 'Ooo' doesn't match '[a-z][a-zA-Z0-9]+' + The lambda parameter name 'Koo' doesn't match '[a-z][a-zA-Z0-9]*' + The explicitly-typed lambda parameter name 'Voo' doesn't match '[a-z][a-zA-Z0-9]*' + The explicitly-typed lambda parameter name 'Ooo' doesn't match '[a-z][a-zA-Z0-9]*' [A-Z]+ 5 - The method parameter name 'Foo' doesn't match '[a-z][a-zA-Z0-9]+' - The final method parameter name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]+' + The method parameter name 'Foo' doesn't match '[a-z][a-zA-Z0-9]*' + The final method parameter name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]*' The lambda parameter name 'Koo' doesn't match '[A-Z]+' - The explicitly-typed lambda parameter name 'Voo' doesn't match '[a-z][a-zA-Z0-9]+' - The explicitly-typed lambda parameter name 'Ooo' doesn't match '[a-z][a-zA-Z0-9]+' + The explicitly-typed lambda parameter name 'Voo' doesn't match '[a-z][a-zA-Z0-9]*' + The explicitly-typed lambda parameter name 'Ooo' doesn't match '[a-z][a-zA-Z0-9]*' [A-Z]+ 5 - The method parameter name 'Foo' doesn't match '[a-z][a-zA-Z0-9]+' - The final method parameter name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]+' - The lambda parameter name 'Koo' doesn't match '[a-z][a-zA-Z0-9]+' + The method parameter name 'Foo' doesn't match '[a-z][a-zA-Z0-9]*' + The final method parameter name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]*' + The lambda parameter name 'Koo' doesn't match '[a-z][a-zA-Z0-9]*' The explicitly-typed lambda parameter name 'Voo' doesn't match '[A-Z]+' The explicitly-typed lambda parameter name 'Ooo' doesn't match '[A-Z]+' diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/LocalVariableNamingConventions.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/LocalVariableNamingConventions.xml index 279131ffe3..9d4bb84134 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/LocalVariableNamingConventions.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/LocalVariableNamingConventions.xml @@ -7,9 +7,9 @@ Default is camel case 3 - The local variable name 'Foo' doesn't match '[a-z][a-zA-Z0-9]+' - The final local variable name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]+' - The exception block parameter name 'E' doesn't match '[a-z][a-zA-Z0-9]+' + The local variable name 'Foo' doesn't match '[a-z][a-zA-Z0-9]*' + The final local variable name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]*' + The exception block parameter name 'E' doesn't match '[a-z][a-zA-Z0-9]*' 3 The local variable name 'Foo' doesn't match '[A-Z][A-Z0-9]+' - The final local variable name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]+' - The exception block parameter name 'E' doesn't match '[a-z][a-zA-Z0-9]+' + The final local variable name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]*' + The exception block parameter name 'E' doesn't match '[a-z][a-zA-Z0-9]*' [A-Z][A-Z0-9]+ 3 - The local variable name 'Foo' doesn't match '[a-z][a-zA-Z0-9]+' + The local variable name 'Foo' doesn't match '[a-z][a-zA-Z0-9]*' The final local variable name 'Hoo' doesn't match '[A-Z][A-Z0-9]+' - The exception block parameter name 'E' doesn't match '[a-z][a-zA-Z0-9]+' + The exception block parameter name 'E' doesn't match '[a-z][a-zA-Z0-9]*' [A-Z][A-Z0-9]+ 3 - The local variable name 'Foo' doesn't match '[a-z][a-zA-Z0-9]+' - The final local variable name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]+' + The local variable name 'Foo' doesn't match '[a-z][a-zA-Z0-9]*' + The final local variable name 'Hoo' doesn't match '[a-z][a-zA-Z0-9]*' The exception block parameter name 'Eff' doesn't match '[A-Z][A-Z0-9]+' method names should not contain underscores 1 - The instance method name 'bar_foo' doesn't match '[a-z][a-zA-Z0-9]+' + The instance method name 'bar_foo' doesn't match '[a-z][a-zA-Z0-9]*' 1 2 - The native method name '__surfunc__' doesn't match '[a-z][a-zA-Z0-9]+' + The native method name '__surfunc__' doesn't match '[a-z][a-zA-Z0-9]*' Date: Thu, 19 Jul 2018 01:54:28 +0200 Subject: [PATCH 008/115] Styling improvements --- .../pmd/util/fxdesigner/fxml/designer.fxml | 2 +- .../pmd/util/fxdesigner/less/designer.less | 66 +++++++++---------- .../util/fxdesigner/less/editor-theme.less | 3 +- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/designer.fxml b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/designer.fxml index a8a67cda20..ac6c5aabb5 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/designer.fxml +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/fxml/designer.fxml @@ -60,7 +60,7 @@
- + diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less index 431d69247d..86bdb93662 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/designer.less @@ -68,26 +68,15 @@ } } -/**************/ -/* Split pane */ -/**************/ - -#mainHorizontalSplitPane > .split-pane-divider { - -fx-background-color: @darker-accent-border; -} - -.info-title-bar .label { - -fx-padding: 0 0 0 6; -} - -.split-pane > .split-pane-divider { - -fx-padding: 0; - -fx-border-color: transparent; - -fx-background-color: @darker-accent; -} .split-pane { -fx-padding: 0; + + .split-pane-divider { + -fx-padding: 0; + -fx-border-color: transparent; + -fx-background-color: @darker-accent; + } } @@ -95,18 +84,30 @@ .fix-width(300); } -.titled-pane > .title, +.titled-pane .title, .info-title-bar { -fx-font-size: 9pt; -fx-pref-height: 24.0; -fx-border-radius: 0.0; -fx-background-radius: 0.0; -fx-background-color: @app-darker-slate-color; + + &.info-title-bar .label { + -fx-padding: 0 0 0 6; + } + } +#main-horizontal-split-pane .split-pane-divider { + -fx-background-color: @app-darker-slate-color; + // The main divider should normally have this darker color to make it visible. + // I can't figure out why it affects the dividers of the accent-header split panes though + //-fx-background-color: @darker-accent-focus; +} + +#main-toolbar, .tool-bar.accent-header, -.split-pane.accent-header > .split-pane-divider, -#main-toolbar, #main-vertical-split-pane > .split-pane-divider { +.split-pane.accent-header .split-pane-divider { -fx-background-color: @app-darker-slate-color; } @@ -117,7 +118,7 @@ -fx-border-width: .6; .button, .choice-box { - -fx-background-color: @darker-accent; + -fx-background-color: @app-base-color; -fx-border-color: @darker-accent-border; -fx-border-radius: 3; } @@ -125,10 +126,6 @@ .button { -fx-padding: -3 5 -3 5; } - - .choice-box { - -fx-border-radius: 3; - } } // This is used for buttons that have just an icon and no text @@ -186,22 +183,25 @@ -fx-tab-min-height: 20px; -fx-tab-max-height: 20px; - .tab-header-area .tab-header-background { - -fx-border-style: none none solid none; - -fx-border-insets: 0 0 1pt 0; - -fx-border-width: 0 0 1pt 0; - -fx-background-color: @fx-base, @app-base-color; - -fx-border-color: transparent; + .tab-header-area { + -fx-padding: 0; + + .tab-header-background { + -fx-border-style: none none solid none; + -fx-border-insets: 0 0 1pt 0; + -fx-border-width: 0 0 1pt 0; + -fx-border-color: transparent; + -fx-background-color: @app-base-color; + } + } &:top .tab-header-area { -fx-background-insets: 0 0 1 0; - -fx-padding: 0; } &:left .tab-header-area { -fx-background-insets: 0 1 0 0; - -fx-padding: 0; } } diff --git a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/editor-theme.less b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/editor-theme.less index 3524ac3d5f..a8f3918c57 100644 --- a/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/editor-theme.less +++ b/pmd-ui/src/main/resources/net/sourceforge/pmd/util/fxdesigner/less/editor-theme.less @@ -67,7 +67,8 @@ .styled-text-area { -fx-background-color: @area-background-color; -fx-border-color: -fx-outer-border, -fx-text-box-border; - -fx-border-insets: -4 -4 -6 -5, -2 -2 -5 -3; + -fx-border-insets: 0, 0; + -fx-padding: 0; .scroll-bar { * { From c362f5a77fa4566f106ffd3bc8b685f93520ad80 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 19 Jul 2018 22:00:34 +0200 Subject: [PATCH 009/115] [java] Prepare for Java 11 --- pmd-java/etc/grammar/Java.jjt | 30 ++++++- .../pmd/lang/java/JavaLanguageModule.java | 3 +- .../pmd/lang/java/ast/ASTFormalParameter.java | 5 +- .../java/ast/ASTVariableDeclaratorId.java | 7 +- .../resources/category/java/bestpractices.xml | 2 + .../pmd/LanguageVersionDiscovererTest.java | 6 +- .../sourceforge/pmd/LanguageVersionTest.java | 6 ++ .../pmd/lang/java/ast/Java11Test.java | 89 +++++++++++++++++++ ...ocalVariableSyntaxForLambdaParameters.java | 28 ++++++ .../xml/AccessorClassGeneration.xml | 49 +++++----- .../xml/AccessorMethodGeneration.xml | 54 ++++++----- pom.xml | 2 +- 12 files changed, 221 insertions(+), 60 deletions(-) create mode 100644 pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java11Test.java create mode 100644 pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java11/LocalVariableSyntaxForLambdaParameters.java diff --git a/pmd-java/etc/grammar/Java.jjt b/pmd-java/etc/grammar/Java.jjt index 6593c7f7a1..ed713afee8 100644 --- a/pmd-java/etc/grammar/Java.jjt +++ b/pmd-java/etc/grammar/Java.jjt @@ -2206,10 +2206,38 @@ void LambdaExpression() : { checkForBadLambdaUsage(); } { VariableDeclaratorId() "->" ( Expression() | Block() ) -| LOOKAHEAD(3) FormalParameters() "->" ( Expression() | Block() ) +| LOOKAHEAD(3) LambdaParameters() "->" ( Expression() | Block() ) | LOOKAHEAD(3) "(" VariableDeclaratorId() ( "," VariableDeclaratorId() )* ")" "->" ( Expression() | Block() ) } +void LambdaParameters() #FormalParameters : +{} +{ + "(" [ LambdaParameterList() ] ")" +} + +void LambdaParameterList() #void : +{} +{ + LambdaParameter() ( "," LambdaParameter() )* +} + +void LambdaParameter() #FormalParameter : +{} +{ + ( "final" {jjtThis.setFinal(true);} | Annotation() )* + LambdaParameterType() + [ "..." {checkForBadVariableArgumentsUsage();} {jjtThis.setVarargs();} ] + VariableDeclaratorId() +} + +void LambdaParameterType() #void : +{} +{ + LOOKAHEAD( { jdkVersion >= 11 && isKeyword("var") } ) + | Type() +} + void PrimarySuffix() : {Token t;} { LOOKAHEAD(2) "." "this" diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java index aa1503ca28..f5fb17220a 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java @@ -24,7 +24,8 @@ public class JavaLanguageModule extends BaseLanguageModule { addVersion("1.7", new JavaLanguageHandler(7), false); addVersion("1.8", new JavaLanguageHandler(8), false); addVersion("9", new JavaLanguageHandler(9), false); - addVersion("10", new JavaLanguageHandler(10), true); + addVersion("10", new JavaLanguageHandler(10), false); + addVersion("11", new JavaLanguageHandler(11), true); } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTFormalParameter.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTFormalParameter.java index 681b4268bd..2657d71436 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTFormalParameter.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTFormalParameter.java @@ -14,6 +14,7 @@ import net.sourceforge.pmd.lang.java.typeresolution.typedefinition.JavaTypeDefin * production of {@link ASTMethodDeclarator} to represent a * method's formal parameter. Also used in the {@link ASTCatchStatement} * production to represent the declared exception variable. + * Also used in LambdaExpressions for the LambdaParameters. *
  *      ( "final" | Annotation )* Type ( "|" Type )* [ "..." ] VariableDeclaratorId
  * 
@@ -93,7 +94,9 @@ public class ASTFormalParameter extends AbstractJavaAccessTypeNode implements Di */ @Override public boolean isArray() { - return isVarargs() || getTypeNode().isArray() || getVariableDeclaratorId().isArray(); + return isVarargs() + || getTypeNode() != null && getTypeNode().isArray() + || getVariableDeclaratorId().isArray(); } @Override diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTVariableDeclaratorId.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTVariableDeclaratorId.java index 8322be0b26..71da3d4d44 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTVariableDeclaratorId.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTVariableDeclaratorId.java @@ -206,7 +206,7 @@ public class ASTVariableDeclaratorId extends AbstractJavaTypeNode implements Dim */ public boolean isTypeInferred() { // TODO think about supporting var for lambda parameters - return isLambdaParamWithNoType() || isLocalVariableTypeInferred(); + return isLambdaParamWithNoType() || isLocalVariableTypeInferred() || isLambdaTypeInferred(); } @@ -222,6 +222,11 @@ public class ASTVariableDeclaratorId extends AbstractJavaTypeNode implements Dim return false; } + private boolean isLambdaTypeInferred() { + return getNthParent(3) instanceof ASTLambdaExpression + && jjtGetParent().getFirstChildOfType(ASTType.class) == null; + } + /** * Returns the first child of the node returned by {@link #getTypeNode()}. * The image of that node can usually be interpreted as the image of the diff --git a/pmd-java/src/main/resources/category/java/bestpractices.xml b/pmd-java/src/main/resources/category/java/bestpractices.xml index 012f8798c0..3c3c71ca03 100644 --- a/pmd-java/src/main/resources/category/java/bestpractices.xml +++ b/pmd-java/src/main/resources/category/java/bestpractices.xml @@ -49,6 +49,7 @@ public abstract class Foo { @@ -77,6 +78,7 @@ public class Outer { diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionDiscovererTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionDiscovererTest.java index f8c30b8f57..f2972b1407 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionDiscovererTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionDiscovererTest.java @@ -26,8 +26,8 @@ public class LanguageVersionDiscovererTest { File javaFile = new File("/path/to/MyClass.java"); LanguageVersion languageVersion = discoverer.getDefaultLanguageVersionForFile(javaFile); - assertEquals("LanguageVersion must be Java 10 !", - LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("10"), languageVersion); + assertEquals("LanguageVersion must be Java 11 !", + LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("11"), languageVersion); } /** @@ -48,7 +48,7 @@ public class LanguageVersionDiscovererTest { public void testLanguageVersionDiscoverer() { PMDConfiguration configuration = new PMDConfiguration(); LanguageVersionDiscoverer languageVersionDiscoverer = configuration.getLanguageVersionDiscoverer(); - assertEquals("Default Java version", LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("10"), + assertEquals("Default Java version", LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("11"), languageVersionDiscoverer .getDefaultLanguageVersion(LanguageRegistry.getLanguage(JavaLanguageModule.NAME))); configuration diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java index 984a99b706..1adfc7c185 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java @@ -34,6 +34,12 @@ public class LanguageVersionTest extends AbstractLanguageVersionTest { LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.7"), }, { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "1.8", LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.8"), }, + { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "9", + LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("9"), }, + { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "10", + LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("10"), }, + { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "11", + LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("11"), }, // this one won't be found: case sensitive! { "JAVA", "JAVA", "1.7", null, }, }); diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java11Test.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java11Test.java new file mode 100644 index 0000000000..623c3088b7 --- /dev/null +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/Java11Test.java @@ -0,0 +1,89 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.java.ast; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; + +import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.java.ParserTstUtil; + +public class Java11Test { + private static String loadSource(String name) { + try { + return IOUtils.toString(Java10Test.class.getResourceAsStream("jdkversiontests/java11/" + name), + StandardCharsets.UTF_8); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Test + public void testLocalVariableSyntaxForLambdaParametersWithJava10() { + ASTCompilationUnit compilationUnit = ParserTstUtil.parseAndTypeResolveJava("10", + loadSource("LocalVariableSyntaxForLambdaParameters.java")); + + List lambdas = compilationUnit.findDescendantsOfType(ASTLambdaExpression.class); + Assert.assertEquals(4, lambdas.size()); + + // (var x) -> String.valueOf(x); + List formalParameters = lambdas.get(0).findDescendantsOfType(ASTFormalParameter.class); + Assert.assertEquals(1, formalParameters.size()); + ASTType type = formalParameters.get(0).getFirstChildOfType(ASTType.class); + assertEquals("var", type.getTypeImage()); + assertEquals(1, type.jjtGetNumChildren()); + ASTReferenceType referenceType = type.getFirstChildOfType(ASTReferenceType.class); + assertNotNull(referenceType); + assertEquals(1, referenceType.jjtGetNumChildren()); + ASTClassOrInterfaceType classType = referenceType.getFirstChildOfType(ASTClassOrInterfaceType.class); + assertNotNull(classType); + assertEquals("var", classType.getImage()); + + // (var x, var y) -> x + y; + formalParameters = lambdas.get(1).findDescendantsOfType(ASTFormalParameter.class); + Assert.assertEquals(2, formalParameters.size()); + type = formalParameters.get(0).getFirstChildOfType(ASTType.class); + assertEquals("var", type.getTypeImage()); + assertEquals(1, type.jjtGetNumChildren()); + referenceType = type.getFirstChildOfType(ASTReferenceType.class); + assertNotNull(referenceType); + assertEquals(1, referenceType.jjtGetNumChildren()); + classType = referenceType.getFirstChildOfType(ASTClassOrInterfaceType.class); + assertNotNull(classType); + assertEquals("var", classType.getImage()); + type = formalParameters.get(1).getFirstChildOfType(ASTType.class); + assertEquals("var", type.getTypeImage()); + assertEquals(1, type.jjtGetNumChildren()); + + // (@Nonnull var x) -> String.valueOf(x); + formalParameters = lambdas.get(2).findDescendantsOfType(ASTFormalParameter.class); + Assert.assertEquals(1, formalParameters.size()); + Node firstChild = formalParameters.get(0).jjtGetChild(0); + Assert.assertTrue(firstChild instanceof ASTAnnotation); + } + + @Test + public void testLocalVariableSyntaxForLambdaParametersWithJava11() { + ASTCompilationUnit compilationUnit = ParserTstUtil.parseAndTypeResolveJava("11", + loadSource("LocalVariableSyntaxForLambdaParameters.java")); + + List lambdas = compilationUnit.findDescendantsOfType(ASTLambdaExpression.class); + Assert.assertEquals(4, lambdas.size()); + + // (var x) -> String.valueOf(x); + List formalParameters = lambdas.get(0).findDescendantsOfType(ASTFormalParameter.class); + Assert.assertEquals(1, formalParameters.size()); + assertNull(formalParameters.get(0).getTypeNode()); + } +} diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java11/LocalVariableSyntaxForLambdaParameters.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java11/LocalVariableSyntaxForLambdaParameters.java new file mode 100644 index 0000000000..7daa4efd82 --- /dev/null +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java11/LocalVariableSyntaxForLambdaParameters.java @@ -0,0 +1,28 @@ +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.function.BiFunction; +import java.util.function.Function; + +public class LocalVariableSyntaxForLambdaParameters { + + @Target({ElementType.PARAMETER}) + @Retention(RetentionPolicy.RUNTIME) + public @interface Nonnull { } + + public void createLambdas() { + //var lambda = (var x, var y) -> x.process(y); + + Function lambda1 = (var x) -> String.valueOf(x); + BiFunction lambda2 = (var x, var y) -> x + y; + } + + public void createAnnotatedLambdaParameters() { + //@Nonnull var x = new Foo(); + //(@Nonnull var x, @Nullable var y) -> x.process(y) + + Function lambda1 = (@Nonnull var x) -> String.valueOf(x); + BiFunction lambda2 = (@Nonnull var x, @Nonnull var y) -> x + y; + } +} \ No newline at end of file diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/AccessorClassGeneration.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/AccessorClassGeneration.xml index 091b027d96..9bd3fd0345 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/AccessorClassGeneration.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/AccessorClassGeneration.xml @@ -4,9 +4,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests http://pmd.sourceforge.net/rule-tests_1_0_0.xsd"> - + inner class has private constructor 1 + java 10 + - + inner class has public constructor 0 + java 10 + - + outer class has public constructor 1 + java 10 + - + final inner class 0 + java 10 + - + interface inner class has private constructor 1 + java 10 + - + there's a check for int declaration - not sure right now why 1 + java 10 + #1452 ArrayIndexOutOfBoundsException with Annotations for AccessorClassGenerationRule 0 + java 10 + - + #291 - Private constructor called from anonymous class 1 + java 10 + - + Array initializer is not a class body 0 + java 10 diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/AccessorMethodGeneration.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/AccessorMethodGeneration.xml index 17b12632f4..bf1b8fd638 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/AccessorMethodGeneration.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/AccessorMethodGeneration.xml @@ -4,9 +4,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests http://pmd.sourceforge.net/rule-tests_1_0_0.xsd"> - + inner class accesses private field from outer class 1 8 + java 10 + - + inner class accesses private field from outer class unqualified 1 8 + java 10 + - + outer class accesses private field from inner class 1 9 + java 10 - - + + + non private fields are ok 0 + java 10 + - + inner class accesses private method of outer class, unqualified 1 4 + java 10 + - + inner class accesses private method of outer class, qualified 1 4 + java 10 + - + outer class accesses private method of inner class 1 8 + java 10 - + inner class accesses non-private methods of outer class 0 + java 10 + - + #274 - Method inside static inner class incorrectly reported as generating accessor methods 0 + java 10 diff --git a/pom.xml b/pom.xml index d754cabb39..feef580d3f 100644 --- a/pom.xml +++ b/pom.xml @@ -764,7 +764,7 @@ Additionally it includes CPD, the copy-paste-detector. CPD finds duplicated code org.ow2.asm asm - 6.1.1 + 6.2 net.sourceforge.pmd From 9c4486f2fbf0d226b1d41b7fef50a07dcc49f376 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 20 Jul 2018 15:23:27 +0200 Subject: [PATCH 010/115] [plsql] Add basic support for CursorForLoop statement --- pmd-plsql/etc/grammar/PldocAST.jjt | 20 ++++++++- .../plsql/ast/PLSQLParserVisitorAdapter.java | 10 +++++ .../lang/plsql/rule/AbstractPLSQLRule.java | 10 +++++ .../lang/plsql/AbstractPLSQLParserTst.java | 11 +++++ .../pmd/lang/plsql/ast/CursorForLoopTest.java | 44 +++++++++++++++++++ .../lang/plsql/ast/CursorForLoopNested.pls | 14 ++++++ .../lang/plsql/ast/CursorForLoopSimple.pls | 16 +++++++ 7 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/CursorForLoopTest.java create mode 100644 pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/CursorForLoopNested.pls create mode 100644 pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/CursorForLoopSimple.pls diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 0d162e6bec..16a46143d4 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -28,6 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** * Added more complete support for CREATE TABLE + * Added ASTCursorForLoop and ASTSelectStatement * * Andreas Dangel 07/2018 *==================================================================== @@ -1176,6 +1177,7 @@ ASTUnlabelledStatement UnlabelledStatement() : | LOOKAHEAD(3) ContinueStatement() ";" // CONTINUE keyword was added in 11G, so Oracle compilation supports CONTINUE as a variable name | CaseStatement() ";" | IfStatement() ";" + | LOOKAHEAD( ID() "("