From 80d3bb0877eaa4364a5a8ebe72b1004c378f5088 Mon Sep 17 00:00:00 2001 From: Niko Gillen Date: Wed, 10 May 2023 12:38:43 +0200 Subject: [PATCH 1/2] fixes #7 --- example/lib/test.xml_layout.dart | 281 ++++++++++++++++++++++--------- lib/builder/builder.dart | 172 +++++++++++-------- lib/types/function.dart | 27 ++- pubspec.yaml | 8 +- 4 files changed, 318 insertions(+), 170 deletions(-) diff --git a/example/lib/test.xml_layout.dart b/example/lib/test.xml_layout.dart index 7b05e6d..25d940f 100644 --- a/example/lib/test.xml_layout.dart +++ b/example/lib/test.xml_layout.dart @@ -3,7 +3,6 @@ import 'package:xml_layout/register.dart'; import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/src/material/material_button.dart'; -import 'package:flutter/src/foundation/basic_types.dart'; import 'package:flutter/src/services/mouse_cursor.dart'; import 'package:flutter/src/material/button_theme.dart'; import 'dart:ui'; @@ -11,7 +10,6 @@ import 'package:flutter/src/painting/edge_insets.dart'; import 'package:flutter/src/material/theme_data.dart'; import 'package:flutter/src/painting/borders.dart'; import 'package:flutter/src/widgets/focus_manager.dart'; -import 'package:flutter/src/services/raw_keyboard.dart'; import 'dart:core'; import 'package:flutter/src/widgets/framework.dart'; import 'package:flutter/src/widgets/basic.dart'; @@ -20,12 +18,12 @@ import 'package:flutter/src/painting/basic_types.dart'; import 'package:flutter/src/material/scaffold.dart'; import 'package:flutter/src/widgets/preferred_size.dart'; import 'package:flutter/src/material/floating_action_button_location.dart'; +import 'package:flutter/src/painting/alignment.dart'; import 'package:flutter/src/gestures/recognizer.dart'; import 'package:flutter/src/widgets/text.dart'; import 'package:flutter/src/painting/text_style.dart'; -import 'package:flutter/src/painting/strut_style.dart'; -import 'package:flutter/src/rendering/paragraph.dart'; import 'package:flutter/src/painting/text_painter.dart'; +import 'package:flutter/src/painting/strut_style.dart'; import 'package:flutter/src/painting/inline_span.dart'; import 'package:flutter/src/widgets/icon.dart'; import 'package:flutter/src/widgets/icon_data.dart'; @@ -35,7 +33,6 @@ import 'package:flutter/src/widgets/scroll_physics.dart'; import 'package:flutter/src/rendering/sliver_grid.dart'; import 'package:flutter/src/widgets/sliver.dart'; import 'package:flutter/src/widgets/container.dart'; -import 'package:flutter/src/painting/alignment.dart'; import 'package:flutter/src/painting/decoration.dart'; import 'package:flutter/src/rendering/box.dart'; import 'package:vector_math/vector_math_64.dart'; @@ -46,7 +43,7 @@ import 'package:flutter/src/material/text_theme.dart'; import 'package:flutter/src/services/system_chrome.dart'; import 'package:flutter/src/widgets/image.dart'; import 'package:flutter/src/painting/image_provider.dart'; -import 'package:flutter/src/painting/image_stream.dart'; +import 'package:flutter/src/animation/animation.dart'; import 'package:flutter/src/painting/box_fit.dart'; import 'package:flutter/src/painting/decoration_image.dart'; import 'dart:io'; @@ -80,15 +77,15 @@ Register register = Register(() { padding: node.s("padding"), visualDensity: node.s("visualDensity"), shape: node.s("shape"), - clipBehavior: (node.s("clipBehavior"))!, + clipBehavior: (node.s("clipBehavior", Clip.none))!, focusNode: node.s("focusNode"), - autofocus: (node.s("autofocus"))!, + autofocus: (node.s("autofocus", false))!, materialTapTargetSize: node.s("materialTapTargetSize"), animationDuration: node.s("animationDuration"), minWidth: node.s("minWidth"), height: node.s("height"), - enableFeedback: (node.s("enableFeedback"))!, + enableFeedback: (node.s("enableFeedback", true))!, child: node.child()); }); XmlLayout.registerInline(MouseCursor, "defer", true, (node, method) { @@ -116,8 +113,8 @@ Register register = Register(() { }); XmlLayout.register("VisualDensity", (node, key) { return VisualDensity( - horizontal: (node.s("horizontal"))!, - vertical: (node.s("vertical"))!); + horizontal: (node.s("horizontal", 0.0))!, + vertical: (node.s("vertical", 0.0))!); }); XmlLayout.registerInline(VisualDensity, "standard", true, (node, method) { return VisualDensity.standard; @@ -136,10 +133,15 @@ Register register = Register(() { XmlLayout.register("FocusNode", (node, key) { return FocusNode( debugLabel: node.s("debugLabel"), + onKey: node.s("onKey"), + onKeyEvent: + node.s("onKeyEvent"), skipTraversal: (node.s("skipTraversal", false))!, canRequestFocus: (node.s("canRequestFocus", true))!, descendantsAreFocusable: - (node.s("descendantsAreFocusable", true))!); + (node.s("descendantsAreFocusable", true))!, + descendantsAreTraversable: + (node.s("descendantsAreTraversable", true))!); }); XmlLayout.registerEnum(MaterialTapTargetSize.values); XmlLayout.register("Duration", (node, key) { @@ -185,6 +187,8 @@ Register register = Register(() { floatingActionButtonAnimator: node .s("floatingActionButtonAnimator"), persistentFooterButtons: node.array("persistentFooterButtons"), + persistentFooterAlignment: (node.s( + "persistentFooterAlignment", AlignmentDirectional.centerEnd))!, drawer: node.s("drawer"), onDrawerChanged: node.s("onDrawerChanged"), endDrawer: node.s("endDrawer"), @@ -193,17 +197,18 @@ Register register = Register(() { bottomSheet: node.s("bottomSheet"), backgroundColor: node.s("backgroundColor"), resizeToAvoidBottomInset: node.s("resizeToAvoidBottomInset"), - primary: (node.s("primary"))!, - drawerDragStartBehavior: - (node.s("drawerDragStartBehavior"))!, - extendBody: (node.s("extendBody"))!, - extendBodyBehindAppBar: (node.s("extendBodyBehindAppBar"))!, + primary: (node.s("primary", true))!, + drawerDragStartBehavior: (node.s( + "drawerDragStartBehavior", DragStartBehavior.start))!, + extendBody: (node.s("extendBody", false))!, + extendBodyBehindAppBar: + (node.s("extendBodyBehindAppBar", false))!, drawerScrimColor: node.s("drawerScrimColor"), drawerEdgeDragWidth: node.s("drawerEdgeDragWidth"), drawerEnableOpenDragGesture: - (node.s("drawerEnableOpenDragGesture"))!, + (node.s("drawerEnableOpenDragGesture", true))!, endDrawerEnableOpenDragGesture: - (node.s("endDrawerEnableOpenDragGesture"))!, + (node.s("endDrawerEnableOpenDragGesture", true))!, restorationId: node.s("restorationId")); }); XmlLayout.registerInline(FloatingActionButtonLocation, "startTop", true, @@ -278,10 +283,53 @@ Register register = Register(() { (node, method) { return FloatingActionButtonLocation.miniEndDocked; }); + XmlLayout.registerInline(FloatingActionButtonLocation, "endContained", true, + (node, method) { + return FloatingActionButtonLocation.endContained; + }); XmlLayout.registerInline(FloatingActionButtonAnimator, "scaling", true, (node, method) { return FloatingActionButtonAnimator.scaling; }); + XmlLayout.registerInline(AlignmentDirectional, "", false, (node, method) { + return AlignmentDirectional(method[0].toDouble(), method[1].toDouble()); + }); + XmlLayout.registerInline(AlignmentDirectional, "topStart", true, + (node, method) { + return AlignmentDirectional.topStart; + }); + XmlLayout.registerInline(AlignmentDirectional, "topCenter", true, + (node, method) { + return AlignmentDirectional.topCenter; + }); + XmlLayout.registerInline(AlignmentDirectional, "topEnd", true, + (node, method) { + return AlignmentDirectional.topEnd; + }); + XmlLayout.registerInline(AlignmentDirectional, "centerStart", true, + (node, method) { + return AlignmentDirectional.centerStart; + }); + XmlLayout.registerInline(AlignmentDirectional, "center", true, + (node, method) { + return AlignmentDirectional.center; + }); + XmlLayout.registerInline(AlignmentDirectional, "centerEnd", true, + (node, method) { + return AlignmentDirectional.centerEnd; + }); + XmlLayout.registerInline(AlignmentDirectional, "bottomStart", true, + (node, method) { + return AlignmentDirectional.bottomStart; + }); + XmlLayout.registerInline(AlignmentDirectional, "bottomCenter", true, + (node, method) { + return AlignmentDirectional.bottomCenter; + }); + XmlLayout.registerInline(AlignmentDirectional, "bottomEnd", true, + (node, method) { + return AlignmentDirectional.bottomEnd; + }); XmlLayout.registerEnum(DragStartBehavior.values); XmlLayout.register("Text", (node, key) { return Text(((node.s("arg:0") ?? node.t()))!, @@ -297,7 +345,8 @@ Register register = Register(() { maxLines: node.s("maxLines"), semanticsLabel: node.s("semanticsLabel"), textWidthBasis: node.s("textWidthBasis"), - textHeightBehavior: node.s("textHeightBehavior")); + textHeightBehavior: node.s("textHeightBehavior"), + selectionColor: node.s("selectionColor")); }); XmlLayout.register("Text.rich", (node, key) { return Text.rich( @@ -314,11 +363,12 @@ Register register = Register(() { maxLines: node.s("maxLines"), semanticsLabel: node.s("semanticsLabel"), textWidthBasis: node.s("textWidthBasis"), - textHeightBehavior: node.s("textHeightBehavior")); + textHeightBehavior: node.s("textHeightBehavior"), + selectionColor: node.s("selectionColor")); }); XmlLayout.register("TextStyle", (node, key) { return TextStyle( - inherit: (node.s("inherit") ?? true)!, + inherit: (node.s("inherit", true))!, color: node.s("color"), backgroundColor: node.s("backgroundColor"), fontSize: node.s("fontSize"), @@ -335,6 +385,7 @@ Register register = Register(() { background: node.s("background"), shadows: node.array("shadows"), fontFeatures: node.array("fontFeatures"), + fontVariations: node.array("fontVariations"), decoration: node.s("decoration"), decorationColor: node.s("decorationColor"), decorationStyle: node.s("decorationStyle"), @@ -342,7 +393,8 @@ Register register = Register(() { debugLabel: node.s("debugLabel"), fontFamily: node.s("fontFamily"), fontFamilyFallback: node.array("fontFamilyFallback"), - package: node.s("package")); + package: node.s("package"), + overflow: node.s("overflow")); }); XmlLayout.registerInline(FontWeight, "w100", true, (node, method) { return FontWeight.w100; @@ -405,6 +457,7 @@ Register register = Register(() { return TextDecoration.lineThrough; }); XmlLayout.registerEnum(TextDecorationStyle.values); + XmlLayout.registerEnum(TextOverflow.values); XmlLayout.register("StrutStyle", (node, key) { return StrutStyle( fontFamily: node.s("fontFamily"), @@ -440,20 +493,26 @@ Register register = Register(() { return StrutStyle.disabled; }); XmlLayout.registerEnum(TextAlign.values); - XmlLayout.registerEnum(TextOverflow.values); XmlLayout.registerEnum(TextWidthBasis.values); XmlLayout.register("TextHeightBehavior", (node, key) { return TextHeightBehavior( - applyHeightToFirstAscent: (node.s("applyHeightToFirstAscent"))!, - applyHeightToLastDescent: (node.s("applyHeightToLastDescent"))!, - leadingDistribution: - (node.s("leadingDistribution"))!); + applyHeightToFirstAscent: + (node.s("applyHeightToFirstAscent", true))!, + applyHeightToLastDescent: + (node.s("applyHeightToLastDescent", true))!, + leadingDistribution: (node.s( + "leadingDistribution", TextLeadingDistribution.proportional))!); }); XmlLayout.register("Icon", (node, key) { return Icon((node.s("arg:0") ?? node.child()), key: key, size: node.s("size"), + fill: node.s("fill"), + weight: node.s("weight"), + grade: node.s("grade"), + opticalSize: node.s("opticalSize"), color: node.s("color"), + shadows: node.array("shadows"), semanticLabel: node.s("semanticLabel"), textDirection: node.s("textDirection")); }); @@ -494,7 +553,9 @@ Register register = Register(() { padding: node.s("padding"), gridDelegate: (node.s("gridDelegate"))!, itemBuilder: - (node.s("itemBuilder"))!, + (node.s("itemBuilder"))!, + findChildIndexCallback: + node.s("findChildIndexCallback"), itemCount: node.s("itemCount"), addAutomaticKeepAlives: (node.s("addAutomaticKeepAlives", true))!, addRepaintBoundaries: (node.s("addRepaintBoundaries", true))!, @@ -591,7 +652,7 @@ Register register = Register(() { XmlLayout.register("ScrollController", (node, key) { return ScrollController( initialScrollOffset: (node.s("initialScrollOffset", 0.0))!, - keepScrollOffset: (node.s("keepScrollOffset"))!, + keepScrollOffset: (node.s("keepScrollOffset", true))!, debugLabel: node.s("debugLabel")); }); XmlLayout.register("ScrollPhysics", (node, key) { @@ -613,14 +674,14 @@ Register register = Register(() { transform: node.s("transform"), transformAlignment: node.s("transformAlignment"), child: node.child(), - clipBehavior: (node.s("clipBehavior"))!); + clipBehavior: (node.s("clipBehavior", Clip.none))!); }); XmlLayout.register("BoxConstraints", (node, key) { return BoxConstraints( - minWidth: (node.s("minWidth"))!, - maxWidth: (node.s("maxWidth"))!, - minHeight: (node.s("minHeight"))!, - maxHeight: (node.s("maxHeight"))!); + minWidth: (node.s("minWidth", 0.0))!, + maxWidth: (node.s("maxWidth", double.infinity))!, + minHeight: (node.s("minHeight", 0.0))!, + maxHeight: (node.s("maxHeight", double.infinity))!); }); XmlLayout.registerInline(BoxConstraints, "tight", false, (node, method) { return BoxConstraints.tight((node.v(method[0]))!); @@ -734,13 +795,18 @@ Register register = Register(() { return AppBar( key: key, leading: node.s("leading"), - automaticallyImplyLeading: (node.s("automaticallyImplyLeading"))!, + automaticallyImplyLeading: + (node.s("automaticallyImplyLeading", true))!, title: node.s("title"), actions: node.array("actions"), flexibleSpace: node.s("flexibleSpace"), bottom: node.s("bottom"), elevation: node.s("elevation"), + scrolledUnderElevation: node.s("scrolledUnderElevation"), + notificationPredicate: (node.s( + "notificationPredicate", defaultScrollNotificationPredicate))!, shadowColor: node.s("shadowColor"), + surfaceTintColor: node.s("surfaceTintColor"), shape: node.s("shape"), backgroundColor: node.s("backgroundColor"), foregroundColor: node.s("foregroundColor"), @@ -748,12 +814,13 @@ Register register = Register(() { iconTheme: node.s("iconTheme"), actionsIconTheme: node.s("actionsIconTheme"), textTheme: node.s("textTheme"), - primary: (node.s("primary"))!, + primary: (node.s("primary", true))!, centerTitle: node.s("centerTitle"), - excludeHeaderSemantics: (node.s("excludeHeaderSemantics"))!, + excludeHeaderSemantics: + (node.s("excludeHeaderSemantics", false))!, titleSpacing: node.s("titleSpacing"), - toolbarOpacity: (node.s("toolbarOpacity"))!, - bottomOpacity: (node.s("bottomOpacity"))!, + toolbarOpacity: (node.s("toolbarOpacity", 1.0))!, + bottomOpacity: (node.s("bottomOpacity", 1.0))!, toolbarHeight: node.s("toolbarHeight"), leadingWidth: node.s("leadingWidth"), backwardsCompatibility: node.s("backwardsCompatibility"), @@ -763,15 +830,35 @@ Register register = Register(() { }); XmlLayout.register("IconThemeData", (node, key) { return IconThemeData( + size: node.s("size"), + fill: node.s("fill"), + weight: node.s("weight"), + grade: node.s("grade"), + opticalSize: node.s("opticalSize"), color: node.s("color"), opacity: node.s("opacity"), - size: node.s("size")); + shadows: node.array("shadows")); }); XmlLayout.registerInline(IconThemeData, "fallback", false, (node, method) { return IconThemeData.fallback(); }); XmlLayout.register("TextTheme", (node, key) { return TextTheme( + displayLarge: node.s("displayLarge"), + displayMedium: node.s("displayMedium"), + displaySmall: node.s("displaySmall"), + headlineLarge: node.s("headlineLarge"), + headlineMedium: node.s("headlineMedium"), + headlineSmall: node.s("headlineSmall"), + titleLarge: node.s("titleLarge"), + titleMedium: node.s("titleMedium"), + titleSmall: node.s("titleSmall"), + bodyLarge: node.s("bodyLarge"), + bodyMedium: node.s("bodyMedium"), + bodySmall: node.s("bodySmall"), + labelLarge: node.s("labelLarge"), + labelMedium: node.s("labelMedium"), + labelSmall: node.s("labelSmall"), headline1: node.s("headline1"), headline2: node.s("headline2"), headline3: node.s("headline3"), @@ -793,9 +880,13 @@ Register register = Register(() { node.s("systemNavigationBarDividerColor"), systemNavigationBarIconBrightness: node.s("systemNavigationBarIconBrightness"), + systemNavigationBarContrastEnforced: + node.s("systemNavigationBarContrastEnforced"), statusBarColor: node.s("statusBarColor"), statusBarBrightness: node.s("statusBarBrightness"), - statusBarIconBrightness: node.s("statusBarIconBrightness")); + statusBarIconBrightness: node.s("statusBarIconBrightness"), + systemStatusBarContrastEnforced: + node.s("systemStatusBarContrastEnforced")); }); XmlLayout.registerInline(SystemUiOverlayStyle, "light", true, (node, method) { return SystemUiOverlayStyle.light; @@ -816,19 +907,21 @@ Register register = Register(() { node.s( "errorBuilder"), semanticLabel: node.s("semanticLabel"), - excludeFromSemantics: (node.s("excludeFromSemantics"))!, + excludeFromSemantics: (node.s("excludeFromSemantics", false))!, width: node.s("width"), height: node.s("height"), color: node.s("color"), + opacity: node.s>("opacity"), colorBlendMode: node.s("colorBlendMode"), fit: node.s("fit"), - alignment: (node.s("alignment"))!, - repeat: (node.s("repeat"))!, + alignment: (node.s("alignment", Alignment.center))!, + repeat: (node.s("repeat", ImageRepeat.noRepeat))!, centerSlice: node.s("centerSlice"), - matchTextDirection: (node.s("matchTextDirection"))!, - gaplessPlayback: (node.s("gaplessPlayback"))!, - isAntiAlias: (node.s("isAntiAlias"))!, - filterQuality: (node.s("filterQuality"))!); + matchTextDirection: (node.s("matchTextDirection", false))!, + gaplessPlayback: (node.s("gaplessPlayback", false))!, + isAntiAlias: (node.s("isAntiAlias", false))!, + filterQuality: + (node.s("filterQuality", FilterQuality.low))!); }); XmlLayout.register("Image.network", (node, key) { return Image.network(((node.s("arg:0") ?? node.t()))!, @@ -843,19 +936,21 @@ Register register = Register(() { node.s( "errorBuilder"), semanticLabel: node.s("semanticLabel"), - excludeFromSemantics: (node.s("excludeFromSemantics"))!, + excludeFromSemantics: (node.s("excludeFromSemantics", false))!, width: node.s("width"), height: node.s("height"), color: node.s("color"), + opacity: node.s>("opacity"), colorBlendMode: node.s("colorBlendMode"), fit: node.s("fit"), - alignment: (node.s("alignment"))!, - repeat: (node.s("repeat"))!, + alignment: (node.s("alignment", Alignment.center))!, + repeat: (node.s("repeat", ImageRepeat.noRepeat))!, centerSlice: node.s("centerSlice"), - matchTextDirection: (node.s("matchTextDirection"))!, - gaplessPlayback: (node.s("gaplessPlayback"))!, - filterQuality: (node.s("filterQuality"))!, - isAntiAlias: (node.s("isAntiAlias"))!, + matchTextDirection: (node.s("matchTextDirection", false))!, + gaplessPlayback: (node.s("gaplessPlayback", false))!, + filterQuality: + (node.s("filterQuality", FilterQuality.low))!, + isAntiAlias: (node.s("isAntiAlias", false))!, headers: node.s>("headers"), cacheWidth: node.s("cacheWidth"), cacheHeight: node.s("cacheHeight")); @@ -870,19 +965,21 @@ Register register = Register(() { node.s( "errorBuilder"), semanticLabel: node.s("semanticLabel"), - excludeFromSemantics: (node.s("excludeFromSemantics"))!, + excludeFromSemantics: (node.s("excludeFromSemantics", false))!, width: node.s("width"), height: node.s("height"), color: node.s("color"), + opacity: node.s>("opacity"), colorBlendMode: node.s("colorBlendMode"), fit: node.s("fit"), - alignment: (node.s("alignment"))!, - repeat: (node.s("repeat"))!, + alignment: (node.s("alignment", Alignment.center))!, + repeat: (node.s("repeat", ImageRepeat.noRepeat))!, centerSlice: node.s("centerSlice"), - matchTextDirection: (node.s("matchTextDirection"))!, - gaplessPlayback: (node.s("gaplessPlayback"))!, - isAntiAlias: (node.s("isAntiAlias"))!, - filterQuality: (node.s("filterQuality"))!, + matchTextDirection: (node.s("matchTextDirection", false))!, + gaplessPlayback: (node.s("gaplessPlayback", false))!, + isAntiAlias: (node.s("isAntiAlias", false))!, + filterQuality: + (node.s("filterQuality", FilterQuality.low))!, cacheWidth: node.s("cacheWidth"), cacheHeight: node.s("cacheHeight")); }); @@ -896,21 +993,23 @@ Register register = Register(() { node.s( "errorBuilder"), semanticLabel: node.s("semanticLabel"), - excludeFromSemantics: (node.s("excludeFromSemantics"))!, + excludeFromSemantics: (node.s("excludeFromSemantics", false))!, scale: node.s("scale"), width: node.s("width"), height: node.s("height"), color: node.s("color"), + opacity: node.s>("opacity"), colorBlendMode: node.s("colorBlendMode"), fit: node.s("fit"), - alignment: (node.s("alignment"))!, - repeat: (node.s("repeat"))!, + alignment: (node.s("alignment", Alignment.center))!, + repeat: (node.s("repeat", ImageRepeat.noRepeat))!, centerSlice: node.s("centerSlice"), - matchTextDirection: (node.s("matchTextDirection"))!, - gaplessPlayback: (node.s("gaplessPlayback"))!, - isAntiAlias: (node.s("isAntiAlias"))!, + matchTextDirection: (node.s("matchTextDirection", false))!, + gaplessPlayback: (node.s("gaplessPlayback", false))!, + isAntiAlias: (node.s("isAntiAlias", false))!, package: node.s("package"), - filterQuality: (node.s("filterQuality"))!, + filterQuality: + (node.s("filterQuality", FilterQuality.low))!, cacheWidth: node.s("cacheWidth"), cacheHeight: node.s("cacheHeight")); }); @@ -925,19 +1024,21 @@ Register register = Register(() { node.s( "errorBuilder"), semanticLabel: node.s("semanticLabel"), - excludeFromSemantics: (node.s("excludeFromSemantics"))!, + excludeFromSemantics: (node.s("excludeFromSemantics", false))!, width: node.s("width"), height: node.s("height"), color: node.s("color"), + opacity: node.s>("opacity"), colorBlendMode: node.s("colorBlendMode"), fit: node.s("fit"), - alignment: (node.s("alignment"))!, - repeat: (node.s("repeat"))!, + alignment: (node.s("alignment", Alignment.center))!, + repeat: (node.s("repeat", ImageRepeat.noRepeat))!, centerSlice: node.s("centerSlice"), - matchTextDirection: (node.s("matchTextDirection"))!, - gaplessPlayback: (node.s("gaplessPlayback"))!, - isAntiAlias: (node.s("isAntiAlias"))!, - filterQuality: (node.s("filterQuality"))!, + matchTextDirection: (node.s("matchTextDirection", false))!, + gaplessPlayback: (node.s("gaplessPlayback", false))!, + isAntiAlias: (node.s("isAntiAlias", false))!, + filterQuality: + (node.s("filterQuality", FilterQuality.low))!, cacheWidth: node.s("cacheWidth"), cacheHeight: node.s("cacheHeight")); }); @@ -998,6 +1099,7 @@ Register register = Register(() { shrinkWrap: (node.s("shrinkWrap", false))!, padding: node.s("padding"), itemExtent: node.s("itemExtent"), + prototypeItem: node.s("prototypeItem"), addAutomaticKeepAlives: (node.s("addAutomaticKeepAlives", true))!, addRepaintBoundaries: (node.s("addRepaintBoundaries", true))!, addSemanticIndexes: (node.s("addSemanticIndexes", true))!, @@ -1023,8 +1125,11 @@ Register register = Register(() { shrinkWrap: (node.s("shrinkWrap", false))!, padding: node.s("padding"), itemExtent: node.s("itemExtent"), + prototypeItem: node.s("prototypeItem"), itemBuilder: - (node.s("itemBuilder"))!, + (node.s("itemBuilder"))!, + findChildIndexCallback: + node.s("findChildIndexCallback"), itemCount: node.s("itemCount"), addAutomaticKeepAlives: (node.s("addAutomaticKeepAlives", true))!, addRepaintBoundaries: (node.s("addRepaintBoundaries", true))!, @@ -1050,7 +1155,9 @@ Register register = Register(() { shrinkWrap: (node.s("shrinkWrap", false))!, padding: node.s("padding"), itemBuilder: - (node.s("itemBuilder"))!, + (node.s("itemBuilder"))!, + findChildIndexCallback: + node.s("findChildIndexCallback"), separatorBuilder: (node.s("separatorBuilder"))!, itemCount: (node.s("itemCount"))!, @@ -1077,6 +1184,7 @@ Register register = Register(() { shrinkWrap: (node.s("shrinkWrap", false))!, padding: node.s("padding"), itemExtent: node.s("itemExtent"), + prototypeItem: node.s("prototypeItem"), childrenDelegate: (node.s("childrenDelegate"))!, cacheExtent: node.s("cacheExtent"), semanticChildCount: node.s("semanticChildCount"), @@ -1104,20 +1212,26 @@ Register register = Register(() { title: node.s("title"), subtitle: node.s("subtitle"), trailing: node.s("trailing"), - isThreeLine: (node.s("isThreeLine"))!, + isThreeLine: (node.s("isThreeLine", false))!, dense: node.s("dense"), visualDensity: node.s("visualDensity"), shape: node.s("shape"), + style: node.s("style"), + selectedColor: node.s("selectedColor"), + iconColor: node.s("iconColor"), + textColor: node.s("textColor"), contentPadding: node.s("contentPadding"), - enabled: (node.s("enabled"))!, + enabled: (node.s("enabled", true))!, onTap: node.s("onTap"), onLongPress: node.s("onLongPress"), + onFocusChange: node.s("onFocusChange"), mouseCursor: node.s("mouseCursor"), - selected: (node.s("selected"))!, + selected: (node.s("selected", false))!, focusColor: node.s("focusColor"), hoverColor: node.s("hoverColor"), + splashColor: node.s("splashColor"), focusNode: node.s("focusNode"), - autofocus: (node.s("autofocus"))!, + autofocus: (node.s("autofocus", false))!, tileColor: node.s("tileColor"), selectedTileColor: node.s("selectedTileColor"), enableFeedback: node.s("enableFeedback"), @@ -1125,4 +1239,5 @@ Register register = Register(() { minVerticalPadding: node.s("minVerticalPadding"), minLeadingWidth: node.s("minLeadingWidth")); }); + XmlLayout.registerEnum(ListTileStyle.values); }); diff --git a/lib/builder/builder.dart b/lib/builder/builder.dart index a1edcad..3d65c4a 100644 --- a/lib/builder/builder.dart +++ b/lib/builder/builder.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:analyzer/dart/element/nullability_suffix.dart'; @@ -10,7 +9,7 @@ import 'package:analyzer/dart/constant/value.dart'; import 'package:dart_style/dart_style.dart'; class BuilderStatus { - Map> _processed = {}; + Map> _processed = {}; List imports = []; Map _convertTypes = {}; Map _inputConvert = {}; @@ -119,7 +118,8 @@ class XmlLayoutBuilder extends Builder { } else if (topLevelElement.name == convertsName) { var converts = topLevelElement.computeConstantValue(); converts!.toMapValue()!.forEach((key, value) { - status._inputConvert[key!.toStringValue()!] = value!.toStringValue()!; + status._inputConvert[key!.toStringValue()!] = + value!.toStringValue()!; }); } } @@ -139,9 +139,7 @@ class XmlLayoutBuilder extends Builder { String output = DartFormatter().format(codes.join('\n')); await buildStep.writeAsString( - buildStep.inputId.changeExtension('.xml_layout.dart'), - output - ); + buildStep.inputId.changeExtension('.xml_layout.dart'), output); } void _processDartType(BuilderStatus status, DartType dartType) { @@ -161,15 +159,19 @@ class XmlLayoutBuilder extends Builder { !dartType.isDartCoreString && !dartType.isDartCoreSymbol) { var element = dartType.element; - if (element != null && (element.kind == ElementKind.CLASS || element.kind == ElementKind.ENUM)) { + if (element != null && element.kind == ElementKind.CLASS) { _processType(status, element as ClassElement); + } else if (element != null && element.kind == ElementKind.ENUM) { + _processEnumType(status, element as EnumElement); } } } } - bool _isConstructorInline(ConstructorElement constructorElement, [Set? caches]) { - if (constructorElement.name.isEmpty && constructorElement.parameters.length == 0) return false; + bool _isConstructorInline(ConstructorElement constructorElement, + [Set? caches]) { + if (constructorElement.name.isEmpty && + constructorElement.parameters.length == 0) return false; if (caches == null) { caches = {}; @@ -177,8 +179,7 @@ class XmlLayoutBuilder extends Builder { } for (var param in constructorElement.parameters) { - if (param.isNamed) - return false; + if (param.isNamed) return false; var type = param.type; if (type.isDartCoreFunction || type.isDartCoreSymbol || @@ -187,18 +188,17 @@ class XmlLayoutBuilder extends Builder { type.isDartAsyncFuture || type.isDartCoreList || type.isDartCoreMap || - type.isDartCoreIterable - ) return false; + type.isDartCoreIterable) return false; if (type.isDartCoreString || type.isDartCoreNum || type.isDartCoreInt || type.isDartCoreDouble || type.isDartCoreBool || - type.isDartCoreNull - ) continue; + type.isDartCoreNull) continue; if (caches.contains(type)) continue; var element = type.element; - if (element!.kind == ElementKind.ENUM) continue; + if (element!.kind == ElementKind.ENUM) + continue; else if (element.kind == ElementKind.CLASS) { caches.add(type); var classElement = element as ClassElement; @@ -209,23 +209,33 @@ class XmlLayoutBuilder extends Builder { break; } } - if (hasInline) continue; - else return false; + if (hasInline) + continue; + else + return false; } else { return false; } - } return true; } + void _processEnumType(BuilderStatus status, EnumElement e) { + if (status._processed.containsKey(e)) return; + status.insertSource(e.source); + + List codes = []; + status._processed[e] = codes; + codes.add('XmlLayout.registerEnum(${e.name}.values);'); + } + void _processType(BuilderStatus status, ClassElement classElement) { if (status._processed.containsKey(classElement)) return; status.insertSource(classElement.source); List codes = []; status._processed[classElement] = codes; - if (classElement.isEnum) { + if (classElement.isDartCoreEnum) { codes.add('XmlLayout.registerEnum(${classElement.name}.values);'); } else { // Process constructors. @@ -235,7 +245,8 @@ class XmlLayoutBuilder extends Builder { if (con.name.isEmpty && con.parameters.length == 0) continue; if (_isConstructorInline(con)) { List segs = []; - segs.add('XmlLayout.registerInline(${classElement.name}, "${con.name}", false, (node, method) {'); + segs.add( + 'XmlLayout.registerInline(${classElement.name}, "${con.name}", false, (node, method) {'); if (con.name.isEmpty) { segs.add('return ${classElement.name}('); } else { @@ -284,7 +295,9 @@ class XmlLayoutBuilder extends Builder { codes.add(segs.join('\n')); } else { - String constructorName = con.name.isEmpty ? "${classElement.name}" : "${classElement.name}.${con.name}"; + String constructorName = con.name.isEmpty + ? "${classElement.name}" + : "${classElement.name}.${con.name}"; List segs = []; segs.add('XmlLayout.register("$constructorName", (node, key) {'); segs.add('return $constructorName('); @@ -307,10 +320,13 @@ class XmlLayoutBuilder extends Builder { } if (type.isDartCoreList || type.isDartCoreIterable) { - var dartType = status.convertType((type as ParameterizedType).typeArguments.first); - params.add('${param.name}: ${nc('node.array<${dartType.getTypeString()}>(${argv[0]})', type)}'); + var dartType = status.convertType( + (type as ParameterizedType).typeArguments.first); + params.add( + '${param.name}: ${nc('node.array<${dartType.getTypeString()}>(${argv[0]})', type)}'); } else { - String line = '${param.name}: ${nc('node.s<${type.getTypeString()}>(${argv.join(',')})', type)}'; + String line = + '${param.name}: ${nc('node.s<${type.getTypeString()}>(${argv.join(',')})', type)}'; params.add(line); } } @@ -324,10 +340,17 @@ class XmlLayoutBuilder extends Builder { } _processDartType(status, type); if (type.isDartCoreList || type.isDartCoreIterable) { - var dartType = (type as ParameterizedType).typeArguments.first; - params.insert(index, nc('node.array<${dartType.getTypeString()}>(${argv[0]})', type)); + var dartType = + (type as ParameterizedType).typeArguments.first; + params.insert( + index, + nc('node.array<${dartType.getTypeString()}>(${argv[0]})', + type)); } else { - params.insert(index, nc('node.s<${type.getTypeString()}>(${argv.join(',')})', type)); + params.insert( + index, + nc('node.s<${type.getTypeString()}>(${argv.join(',')})', + type)); } } @@ -336,39 +359,45 @@ class XmlLayoutBuilder extends Builder { for (var param in con.parameters) { if (param.isNamed) { switch (param.name) { - case 'key': { - params.add('${param.name}: key'); - break; - } - case 'child': { - hasChild = true; - var type = status.convertType(param.type); - _processDartType(status, type); - params.add('${param.name}: ${nc('node.child<${type.getTypeString()}>()', type)}'); - break; - } + case 'key': + { + params.add('${param.name}: key'); + break; + } + case 'child': + { + hasChild = true; + var type = status.convertType(param.type); + _processDartType(status, type); + params.add( + '${param.name}: ${nc('node.child<${type.getTypeString()}>()', type)}'); + break; + } case 'children': - case 'slivers': { - hasChild = true; - var type = status.convertType(param.type); - if (type.isDartCoreList) { - String typeName; - if (type is ParameterizedType) { - typeName = type.typeArguments.first.getTypeString(); + case 'slivers': + { + hasChild = true; + var type = status.convertType(param.type); + if (type.isDartCoreList) { + String typeName; + if (type is ParameterizedType) { + typeName = type.typeArguments.first.getTypeString(); + } else { + typeName = 'dynamic'; + } + _processDartType(status, type); + params + .add('${param.name}: node.children<$typeName>()'); } else { - typeName = 'dynamic'; + insertNamedParam(param); } - _processDartType(status, type); - params.add('${param.name}: node.children<$typeName>()'); - } else { + break; + } + default: + { insertNamedParam(param); + break; } - break; - } - default: { - insertNamedParam(param); - break; - } } } else { indexedParams.add(param); @@ -391,18 +420,21 @@ class XmlLayoutBuilder extends Builder { if (type.isDartCoreString || type.isDartCoreInt || type.isDartCoreDouble || - type.isDartCoreBool - ) { + type.isDartCoreBool) { child = 'node.t<$typeName>()'; } else { child = 'node.child<$typeName>()'; - status.insertSource(param.type?.element?.source); + status.insertSource(param.type.element?.source); } - params.insert(0, nc('(node.s<$typeName?>(${argv.join(',')}) ?? $child)', type)); - + params.insert( + 0, + nc('(node.s<$typeName?>(${argv.join(',')}) ?? $child)', + type)); } } else { - for (var index = 0, t = indexedParams.length; index < t; ++index) { + for (var index = 0, t = indexedParams.length; + index < t; + ++index) { insertIndexParam(indexedParams[index], index); } } @@ -418,9 +450,12 @@ class XmlLayoutBuilder extends Builder { // Process static fields. for (var field in classElement.fields) { - if (field.isStatic && field.isPublic && field.type == classElement.thisType) { + if (field.isStatic && + field.isPublic && + field.type == classElement.thisType) { List segs = []; - segs.add('XmlLayout.registerInline(${classElement.name}, "${field.name}", true, (node, method) {'); + segs.add( + 'XmlLayout.registerInline(${classElement.name}, "${field.name}", true, (node, method) {'); segs.add("return ${classElement.name}.${field.name};"); segs.add('});'); @@ -462,7 +497,8 @@ class XmlLayoutBuilder extends Builder { } } List segs = []; - segs.add('XmlLayout.registerInline(${targetType.getDisplayString(withNullability: false)}, "${field.name}", true, (node, method) {'); + segs.add( + 'XmlLayout.registerInline(${targetType.getDisplayString(withNullability: false)}, "${field.name}", true, (node, method) {'); segs.add("return ${classElement.name}.${field.name};"); segs.add('});'); @@ -482,10 +518,10 @@ class XmlLayoutBuilder extends Builder { @override Map> get buildExtensions => const { - '.dart': ['.xml_layout.dart'] - }; + '.dart': ['.xml_layout.dart'] + }; } XmlLayoutBuilder builderFactory(BuilderOptions options) { return XmlLayoutBuilder(options); -} \ No newline at end of file +} diff --git a/lib/types/function.dart b/lib/types/function.dart index a27701e..9501bf9 100644 --- a/lib/types/function.dart +++ b/lib/types/function.dart @@ -40,6 +40,7 @@ abstract class Action { } } } + dynamic call(Status status); } @@ -51,7 +52,7 @@ class Call extends Action { dynamic call(Status status) { if (func != null) { - return Function.apply(func!, args?.map((e) => e.value)?.toList() ?? []); + return Function.apply(func!, args?.map((e) => e.value).toList() ?? []); } } } @@ -59,9 +60,7 @@ class Call extends Action { class Builder extends Action { final NodeData node; - Builder(this.node, { - String? ret - }) : super(ret: ret); + Builder(this.node, {String? ret}) : super(ret: ret); @override call(Status status) { @@ -97,7 +96,6 @@ class Script extends Action { } return ret; } - } class Argument { @@ -109,6 +107,7 @@ class Argument { const List _emptyArgs = [null, null, null, null, null]; typedef _Func = T Function([dynamic, dynamic, dynamic, dynamic, dynamic]); + class _ReturnType { _Func function(NodeData node) { return ([a1, a2, a3, a4, a5]) { @@ -117,6 +116,7 @@ class _ReturnType { })); }; } + T creator(NodeData node) { var iter = node.iterable(); dynamic ret; @@ -135,12 +135,14 @@ class _ReturnType { } } } + Map _returnTypes = {}; void registerReturnType([String? name]) { String typeName = name ?? T.toString().toLowerCase(); _returnTypes[typeName] = _ReturnType(); } + int _functionTag = 0x10003; _ReturnType _defaultReturnType = _ReturnType(); @@ -162,18 +164,16 @@ Register register = Register(() { ret = node.status.execute(creator); } if (ret == true) { - return returnType.creator(_createNewNode(node, { - "args": _emptyArgs - })); + return returnType.creator(_createNewNode(node, {"args": _emptyArgs})); } else { return returnType.function(node); } }); XmlLayout.register("Call", (node, key) { var call = Call( - func: node.s("function"), - ret: node.s("return"), - args: node.children()); + func: node.s("function"), + ret: node.s("return"), + args: node.children()); call.execute(node.status); return call; }); @@ -186,9 +186,7 @@ Register register = Register(() { }); XmlLayout.register("SetArgument", (node, key) { var set = SetArgument( - ret: node.s("return"), - argument: node.s("argument") - ); + ret: node.s("return"), argument: node.s("argument")); set.execute(node.status); return set; }); @@ -200,5 +198,4 @@ Register register = Register(() { XmlLayout.register("Argument", (node, key) { return Argument(node); }); - }); diff --git a/pubspec.yaml b/pubspec.yaml index a1f112a..b86a1a6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,10 +13,10 @@ environment: dependencies: flutter: sdk: flutter - xml: ^5.1.2 - analyzer: ^1.7.1 - dart_style: ^2.1.1 - build: ^2.1.0 + xml: ^6.2.2 + analyzer: ^5.10.0 + dart_style: ^2.3.1 + build: ^2.3.1 dev_dependencies: From 453de86a5cae0988fc7b0e0c5706fda4d6ac5968 Mon Sep 17 00:00:00 2001 From: Niko Gillen Date: Wed, 10 May 2023 14:13:43 +0200 Subject: [PATCH 2/2] fix collection_isSubTypeOf --- lib/builder/builder.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/builder/builder.dart b/lib/builder/builder.dart index 3d65c4a..0446cf3 100644 --- a/lib/builder/builder.dart +++ b/lib/builder/builder.dart @@ -466,7 +466,7 @@ class XmlLayoutBuilder extends Builder { } bool _isSubTypeOf(InterfaceType type, DartType? targetType) { - if (type == targetType) return true; + if (targetType?.asInstanceOf(type.element) != null) return true; for (var supperType in type.allSupertypes) { var ret = _isSubTypeOf(supperType, targetType); if (ret) return true;