Skip to content

Commit e400bdd

Browse files
authored
Support @forward in sass-parser (#2435)
1 parent d1fefb6 commit e400bdd

19 files changed

+1381
-20
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.81.0-dev
2+
3+
* No user-visible changes.
4+
15
## 1.80.7
26

37
### Embedded Host

lib/src/js/parser.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import '../util/string.dart';
1919
import '../visitor/interface/expression.dart';
2020
import '../visitor/interface/statement.dart';
2121
import 'reflection.dart';
22+
import 'set.dart';
2223
import 'visitor/expression.dart';
2324
import 'visitor/statement.dart';
2425

@@ -30,13 +31,15 @@ class ParserExports {
3031
required Function parseIdentifier,
3132
required Function toCssIdentifier,
3233
required Function createExpressionVisitor,
33-
required Function createStatementVisitor});
34+
required Function createStatementVisitor,
35+
required Function setToJS});
3436

3537
external set parse(Function function);
3638
external set parseIdentifier(Function function);
3739
external set toCssIdentifier(Function function);
3840
external set createStatementVisitor(Function function);
3941
external set createExpressionVisitor(Function function);
42+
external set setToJS(Function function);
4043
}
4144

4245
/// An empty interpolation, used to initialize empty AST entries to modify their
@@ -57,7 +60,8 @@ ParserExports loadParserExports() {
5760
createExpressionVisitor: allowInterop(
5861
(JSExpressionVisitorObject inner) => JSExpressionVisitor(inner)),
5962
createStatementVisitor: allowInterop(
60-
(JSStatementVisitorObject inner) => JSStatementVisitor(inner)));
63+
(JSStatementVisitorObject inner) => JSStatementVisitor(inner)),
64+
setToJS: allowInterop((Set<Object?> set) => JSSet([...set])));
6165
}
6266

6367
/// Modifies the prototypes of the Sass AST classes to provide access to JS.

lib/src/js/set.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright 2021 Google Inc. Use of this source code is governed by an
2+
// MIT-style license that can be found in the LICENSE file or at
3+
// https://opensource.org/licenses/MIT.
4+
5+
import 'package:js/js.dart';
6+
7+
@JS('Set')
8+
class JSSet {
9+
external JSSet(List<Object?> contents);
10+
}

pkg/sass-parser/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.4.5-dev
2+
3+
* Add support for parsing the `@forward` rule.
4+
15
## 0.4.4
26

37
* No user-visible changes.

pkg/sass-parser/lib/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ export {
7272
ErrorRuleRaws,
7373
} from './src/statement/error-rule';
7474
export {ForRule, ForRuleProps, ForRuleRaws} from './src/statement/for-rule';
75+
export {
76+
ForwardMemberList,
77+
ForwardMemberProps,
78+
ForwardRule,
79+
ForwardRuleProps,
80+
ForwardRuleRaws,
81+
} from './src/statement/forward-rule';
7582
export {
7683
GenericAtRule,
7784
GenericAtRuleProps,

pkg/sass-parser/lib/src/configuration.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {LazySource} from './lazy-source';
1313
import {Node} from './node';
1414
import type * as sassInternal from './sass-internal';
1515
import * as utils from './utils';
16+
import {ForwardRule} from './statement/forward-rule';
1617
import {UseRule} from './statement/use-rule';
1718

1819
/**
@@ -51,7 +52,7 @@ export interface ConfigurationProps {
5152
export class Configuration extends Node {
5253
readonly sassType = 'configuration' as const;
5354
declare raws: ConfigurationRaws;
54-
declare parent: UseRule | undefined; // TODO: forward as well
55+
declare parent: ForwardRule | UseRule | undefined;
5556

5657
/** The underlying map from variable names to their values. */
5758
private _variables: Map<string, ConfiguredVariable> = new Map();

pkg/sass-parser/lib/src/sass-internal.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ export interface SourceFile {
2525
getText(start: number, end?: number): string;
2626
}
2727

28+
export interface DartSet<T> {
29+
_type: T;
30+
31+
// A brand to make this function as a nominal type.
32+
_unique: 'DartSet';
33+
}
34+
2835
// There may be a better way to declare this, but I can't figure it out.
2936
// eslint-disable-next-line @typescript-eslint/no-namespace
3037
declare namespace SassInternal {
@@ -37,6 +44,8 @@ declare namespace SassInternal {
3744

3845
function toCssIdentifier(text: string): string;
3946

47+
function setToJS<T>(set: DartSet<T>): Set<T>;
48+
4049
class StatementVisitor<T> {
4150
private _fakePropertyToMakeThisAUniqueType1: T;
4251
}
@@ -105,6 +114,16 @@ declare namespace SassInternal {
105114
readonly isExclusive: boolean;
106115
}
107116

117+
class ForwardRule extends Statement {
118+
readonly url: Object;
119+
readonly shownMixinsAndFunctions?: DartSet<string>;
120+
readonly shownVariables?: DartSet<string>;
121+
readonly hiddenMixinsAndFunctions?: DartSet<string>;
122+
readonly hiddenVariables?: DartSet<string>;
123+
readonly prefix?: string;
124+
readonly configuration: ConfiguredVariable[];
125+
}
126+
108127
class LoudComment extends Statement {
109128
readonly text: Interpolation;
110129
}
@@ -247,6 +266,7 @@ export type EachRule = SassInternal.EachRule;
247266
export type ErrorRule = SassInternal.ErrorRule;
248267
export type ExtendRule = SassInternal.ExtendRule;
249268
export type ForRule = SassInternal.ForRule;
269+
export type ForwardRule = SassInternal.ForwardRule;
250270
export type LoudComment = SassInternal.LoudComment;
251271
export type MediaRule = SassInternal.MediaRule;
252272
export type SilentComment = SassInternal.SilentComment;
@@ -273,6 +293,7 @@ export interface StatementVisitorObject<T> {
273293
visitErrorRule(node: ErrorRule): T;
274294
visitExtendRule(node: ExtendRule): T;
275295
visitForRule(node: ForRule): T;
296+
visitForwardRule(node: ForwardRule): T;
276297
visitLoudComment(node: LoudComment): T;
277298
visitMediaRule(node: MediaRule): T;
278299
visitSilentComment(node: SilentComment): T;
@@ -296,3 +317,4 @@ export const parseIdentifier = sassInternal.parseIdentifier;
296317
export const toCssIdentifier = sassInternal.toCssIdentifier;
297318
export const createStatementVisitor = sassInternal.createStatementVisitor;
298319
export const createExpressionVisitor = sassInternal.createExpressionVisitor;
320+
export const setToJS = sassInternal.setToJS;

0 commit comments

Comments
 (0)