Title: [222359] trunk/Source/WebInspectorUI
Revision
222359
Author
[email protected]
Date
2017-09-21 16:05:22 -0700 (Thu, 21 Sep 2017)

Log Message

Web Inspector: Add autocompletion suggestions for CSS functions (constant(), linear-gradient(), etc)
https://bugs.webkit.org/show_bug.cgi?id=177264

Patch by Joseph Pecoraro <[email protected]> on 2017-09-21
Reviewed by Matt Baker.

* UserInterface/Controllers/CodeMirrorCompletionController.js:
(WI.CodeMirrorCompletionController.prototype._generateCSSCompletions):
Detect when we are inside of functions and provide completion suggestions
for the relevant function.

* UserInterface/Models/CSSCompletions.js:
Syntax highlight "constant()" like we do for "var()".

* UserInterface/Models/CSSKeywordCompletions.js:
(WI.CSSKeywordCompletions.forProperty):
Always suggest "constant()" everywhere, like we do for "var()".

(WI.CSSKeywordCompletions.forFunction):
Provide suggestions for some CSS functions.

Modified Paths

Diff

Modified: trunk/Source/WebInspectorUI/ChangeLog (222358 => 222359)


--- trunk/Source/WebInspectorUI/ChangeLog	2017-09-21 23:03:30 UTC (rev 222358)
+++ trunk/Source/WebInspectorUI/ChangeLog	2017-09-21 23:05:22 UTC (rev 222359)
@@ -1,5 +1,27 @@
 2017-09-21  Joseph Pecoraro  <[email protected]>
 
+        Web Inspector: Add autocompletion suggestions for CSS functions (constant(), linear-gradient(), etc)
+        https://bugs.webkit.org/show_bug.cgi?id=177264
+
+        Reviewed by Matt Baker.
+
+        * UserInterface/Controllers/CodeMirrorCompletionController.js:
+        (WI.CodeMirrorCompletionController.prototype._generateCSSCompletions):
+        Detect when we are inside of functions and provide completion suggestions
+        for the relevant function.
+
+        * UserInterface/Models/CSSCompletions.js:
+        Syntax highlight "constant()" like we do for "var()".
+
+        * UserInterface/Models/CSSKeywordCompletions.js:
+        (WI.CSSKeywordCompletions.forProperty):
+        Always suggest "constant()" everywhere, like we do for "var()".
+
+        (WI.CSSKeywordCompletions.forFunction):
+        Provide suggestions for some CSS functions.
+
+2017-09-21  Joseph Pecoraro  <[email protected]>
+
         Web Inspector: Remove support for CSS Regions
         https://bugs.webkit.org/show_bug.cgi?id=177287
 

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/CodeMirrorCompletionController.js (222358 => 222359)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/CodeMirrorCompletionController.js	2017-09-21 23:03:30 UTC (rev 222358)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/CodeMirrorCompletionController.js	2017-09-21 23:05:22 UTC (rev 222359)
@@ -541,8 +541,8 @@
 
     _generateCSSCompletions(mainToken, base, suffix)
     {
-        // We only support completion inside CSS block context.
-        if (mainToken.state.state === "media" || mainToken.state.state === "top" || mainToken.state.state === "parens")
+        // We support completion inside CSS block context and functions.
+        if (mainToken.state.state === "media" || mainToken.state.state === "top")
             return [];
 
         // Don't complete in the middle of a property name.
@@ -552,8 +552,7 @@
         var token = mainToken;
         var lineNumber = this._lineNumber;
 
-        // Scan backwards looking for the current property.
-        while (token.state.state === "prop") {
+        let getPreviousToken = () => {
             // Found the beginning of the line. Go to the previous line.
             if (!token.start) {
                 --lineNumber;
@@ -560,13 +559,41 @@
 
                 // No more lines, stop.
                 if (lineNumber < 0)
-                    break;
+                    return null;
             }
 
-            // Get the previous token.
-            token = this._codeMirror.getTokenAt({line: lineNumber, ch: token.start ? token.start : Number.MAX_VALUE});
+            return this._codeMirror.getTokenAt({line: lineNumber, ch: token.start ? token.start : Number.MAX_VALUE});
         }
 
+        // Inside a function, determine the function name.
+        if (token.state.state === "parens") {
+            // Scan backwards looking for the function paren boundary.
+            while (token && token.state.state === "parens" && token.string !== "(")
+                token = getPreviousToken();
+
+            // The immediately preceding token should have the function name.
+            if (token)
+                token = getPreviousToken();
+
+            // No completions if no function name found.
+            if (!token)
+                return [];
+
+            let functionName = token.string;
+            if (!functionName)
+                return [];
+
+            return WI.CSSKeywordCompletions.forFunction(functionName).startsWith(this._prefix);
+        }
+
+        // Scan backwards looking for the current property.
+        while (token.state.state === "prop") {
+            let previousToken = getPreviousToken();
+            if (!previousToken)
+                break;
+            token = previousToken;
+        }
+
         // If we have a property token and it's not the main token, then we are working on
         // the value for that property and should complete allowed values.
         if (mainToken !== token && token.type && /\bproperty\b/.test(token.type)) {

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js (222358 => 222359)


--- trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js	2017-09-21 23:03:30 UTC (rev 222358)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js	2017-09-21 23:05:22 UTC (rev 222359)
@@ -97,7 +97,7 @@
                 return;
 
             var propertyNamesForCodeMirror = {};
-            var valueKeywordsForCodeMirror = {"inherit": true, "initial": true, "unset": true, "revert": true, "var": true};
+            var valueKeywordsForCodeMirror = {"inherit": true, "initial": true, "unset": true, "revert": true, "var": true, "constant": true};
             var colorKeywordsForCodeMirror = {};
 
             function nameForCodeMirror(name)

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/CSSKeywordCompletions.js (222358 => 222359)


--- trunk/Source/WebInspectorUI/UserInterface/Models/CSSKeywordCompletions.js	2017-09-21 23:03:30 UTC (rev 222358)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/CSSKeywordCompletions.js	2017-09-21 23:05:22 UTC (rev 222359)
@@ -33,7 +33,7 @@
 
 WI.CSSKeywordCompletions.forProperty = function(propertyName)
 {
-    let acceptedKeywords = ["initial", "unset", "revert", "var()"];
+    let acceptedKeywords = ["initial", "unset", "revert", "var()", "constant()"];
     let isNotPrefixed = propertyName.charAt(0) !== "-";
 
     if (propertyName in WI.CSSKeywordCompletions._propertyKeywordMap)
@@ -62,6 +62,26 @@
     return new WI.CSSCompletions(acceptedKeywords, true);
 };
 
+WI.CSSKeywordCompletions.forFunction = function(functionName)
+{
+    let suggestions = ["var()"];
+
+    if (functionName === "var")
+        suggestions = [];
+    else if (functionName === "constant")
+        suggestions = suggestions.concat(["safe-area-inset-top", "safe-area-inset-right", "safe-area-inset-bottom", "safe-area-inset-left"]);
+    else if (functionName === "image-set")
+        suggestions.push("url()");
+    else if (functionName === "repeat")
+        suggestions = suggestions.concat(["auto", "auto-fill", "auto-fit", "min-content", "max-content"]);
+    else if (functionName.endsWith("gradient")) {
+        suggestions = suggestions.concat(["to", "left", "right", "top", "bottom"]);
+        suggestions = suggestions.concat(WI.CSSKeywordCompletions._colors);
+    }
+
+    return new WI.CSSCompletions(suggestions, true);
+}
+
 WI.CSSKeywordCompletions.addCustomCompletions = function(properties)
 {
     for (var property of properties) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to