From e81e528b24b8ec5829e87220cee514969fa31fb8 Mon Sep 17 00:00:00 2001 From: Stargator Date: Thu, 9 Aug 2018 10:52:23 -0400 Subject: [PATCH 1/5] Add support for HttpHeaders --- lib/io.dart | 56 ++++++++++++++++++++++++++++++++++++++++++++++ pubspec.yaml | 2 +- tool/generate.dart | 44 ++++++++++++++++++++---------------- 3 files changed, 82 insertions(+), 20 deletions(-) diff --git a/lib/io.dart b/lib/io.dart index 7028027..83020a8 100644 --- a/lib/io.dart +++ b/lib/io.dart @@ -102,6 +102,62 @@ abstract class HttpStatus { io.HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR; } +abstract class HttpHeaders { + static const acceptHeader = io.HttpHeaders.ACCEPT; + static const acceptCharsetHeader = io.HttpHeaders.ACCEPT_CHARSET; + static const acceptEncodingHeader = io.HttpHeaders.ACCEPT_ENCODING; + static const acceptLanguageHeader = io.HttpHeaders.ACCEPT_LANGUAGE; + static const acceptRangesHeader = io.HttpHeaders.ACCEPT_RANGES; + static const ageHeader = io.HttpHeaders.AGE; + static const allowHeader = io.HttpHeaders.ALLOW; + static const authorizationHeader = io.HttpHeaders.AUTHORIZATION; + static const cacheControlHeader = io.HttpHeaders.CACHE_CONTROL; + static const connectionHeader = io.HttpHeaders.CONNECTION; + static const contentEncodingHeader = io.HttpHeaders.CONTENT_ENCODING; + static const contentLanguageHeader = io.HttpHeaders.CONTENT_LANGUAGE; + static const contentLengthHeader = io.HttpHeaders.CONTENT_LENGTH; + static const contentLocationHeader = io.HttpHeaders.CONTENT_LOCATION; + static const contentMd5Header = io.HttpHeaders.CONTENT_MD5; + static const contentRangeHeader = io.HttpHeaders.CONTENT_RANGE; + static const contentTypeHeader = io.HttpHeaders.CONTENT_TYPE; + static const dateHeader = io.HttpHeaders.DATE; + static const etagHeader = io.HttpHeaders.ETAG; + static const expectHeader = io.HttpHeaders.EXPECT; + static const expiresHeader = io.HttpHeaders.EXPIRES; + static const fromHeader = io.HttpHeaders.FROM; + static const hostHeader = io.HttpHeaders.HOST; + static const ifMatchHeader = io.HttpHeaders.IF_MATCH; + static const ifModifiedSinceHeader = io.HttpHeaders.IF_MODIFIED_SINCE; + static const ifNoneMatchHeader = io.HttpHeaders.IF_NONE_MATCH; + static const ifRangeHeader = io.HttpHeaders.IF_RANGE; + static const ifUnmodifiedSinceHeader = io.HttpHeaders.IF_UNMODIFIED_SINCE; + static const lastModifiedHeader = io.HttpHeaders.LAST_MODIFIED; + static const locationHeader = io.HttpHeaders.LOCATION; + static const maxForwardsHeader = io.HttpHeaders.MAX_FORWARDS; + static const pragmaHeader = io.HttpHeaders.PRAGMA; + static const proxyAuthenticateHeader = io.HttpHeaders.PROXY_AUTHENTICATE; + static const proxyAuthorizationHeader = io.HttpHeaders.PROXY_AUTHORIZATION; + static const rangeHeader = io.HttpHeaders.RANGE; + static const refererHeader = io.HttpHeaders.REFERER; + static const retryAfterHeader = io.HttpHeaders.RETRY_AFTER; + static const serverHeader = io.HttpHeaders.SERVER; + static const teHeader = io.HttpHeaders.TE; + static const trailerHeader = io.HttpHeaders.TRAILER; + static const transferEncodingHeader = io.HttpHeaders.TRANSFER_ENCODING; + static const upgradeHeader = io.HttpHeaders.UPGRADE; + static const userAgentHeader = io.HttpHeaders.USER_AGENT; + static const varyHeader = io.HttpHeaders.VARY; + static const viaHeader = io.HttpHeaders.VIA; + static const warningHeader = io.HttpHeaders.WARNING; + static const wwwAuthenticateHeader = io.HttpHeaders.WWW_AUTHENTICATE; + static const cookieHeader = io.HttpHeaders.COOKIE; + static const setCookieHeader = io.HttpHeaders.SET_COOKIE; + static const generalHeadersHeader = io.HttpHeaders.GENERAL_HEADERS; + static const entityHeadersHeader = io.HttpHeaders.ENTITY_HEADERS; + static const responseHeadersHeader = io.HttpHeaders.RESPONSE_HEADERS; + static const requestHeadersHeader = io.HttpHeaders.REQUEST_HEADERS; +} + abstract class HttpClient { static const defaultHttpPort = io.HttpClient.DEFAULT_HTTP_PORT; static const defaultHttpsPort = io.HttpClient.DEFAULT_HTTPS_PORT; diff --git a/pubspec.yaml b/pubspec.yaml index 6dc1819..fb9d73c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: dart2_constant -version: 1.0.1+dart1 +version: 1.0.2+dart1 description: A polyfill for Dart 2 constant names. author: Dart Team homepage: https://github.com/dart-lang/dart2_constant diff --git a/tool/generate.dart b/tool/generate.dart index 13886d6..e75c18b 100644 --- a/tool/generate.dart +++ b/tool/generate.dart @@ -50,8 +50,10 @@ void main(List args) { var buffer = new StringBuffer(); var dart1Library = _library(dart1, url); var dart2Library = _library(dart2, url); + for (var unit in [dart1Library.definingCompilationUnit] ..addAll(dart1Library.parts)) { + for (var variable in unit.topLevelVariables) { if (!_isCapsConstant(variable)) continue; @@ -69,31 +71,15 @@ void main(List args) { for (var type in unit.types) { if (type.isPrivate) continue; - // HttpHeaders has constant names where camel-case members already exist - // (CONTENT_LENGTH etc). I don't want to guess what the migration for - // these will be so I'm just not converting them. - if (name == "io" && type.displayName == "HttpHeaders") continue; - var dart2Type = _find(dart2Library, type.displayName); if (dart2Type == null) continue; - var constants = type.fields - .where((field) => field.isStatic && _isCapsConstant(field)) - .toList(); + var constants = type.fields.where((field) => field.isStatic && _isCapsConstant(field)).toList(); + if (constants.isEmpty) continue; buffer.writeln("abstract class ${type.displayName} {"); - for (var constant in constants) { - var newName = _camelCase(constant.displayName); - var useNewName = !generateDart1 && _find(dart2Type, newName) != null; - if (!useNewName && _find(dart2Type, constant.displayName) == null) { - continue; - } - - buffer.write("static const $newName = $name.${type.displayName}."); - buffer.write(useNewName ? newName : constant.displayName); - buffer.writeln(";"); - } + _writeOutConstants(constants, type, buffer, name, generateDart1, dart2Type); buffer.writeln("}"); } } @@ -162,6 +148,26 @@ bool _isCapsConstant(VariableElement variable) { return true; } +void _writeOutConstants(List constants, ClassElement type, StringBuffer buffer, String name, + bool generateDart1, Element dart2Type) { + for (var constant in constants) { + var newName = _camelCase(constant.displayName); + + if (name == "io" && type.displayName == "HttpHeaders") { + newName += "Header"; + } + + var useNewName = !generateDart1 && _find(dart2Type, newName) != null; + if (!useNewName && _find(dart2Type, constant.displayName) == null) { + continue; + } + + buffer.write("static const $newName = $name.${type.displayName}."); + buffer.write(useNewName ? newName : constant.displayName); + buffer.writeln(";"); + } +} + /// Special-case identifiers whose camel-casing doesn't follow the normal logic. final _specialCases = { "BASE64URL": "base64Url", From a8f15bc2bdd3ca83ba862b3dfb083837119828ed Mon Sep 17 00:00:00 2001 From: Stargator Date: Thu, 9 Aug 2018 10:53:00 -0400 Subject: [PATCH 2/5] Update SDK constraint to set 2.0 as the upper threshold --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index fb9d73c..4910b54 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ author: Dart Team homepage: https://github.com/dart-lang/dart2_constant environment: - sdk: '>=1.24.0 <2.0.0-dev.44' + sdk: '>=1.24.0 <2.0.0' dev_dependencies: args: "^1.0.0" From b24346dfef1cddcb3574ed28713661dc59aee32f Mon Sep 17 00:00:00 2001 From: Stargator Date: Thu, 9 Aug 2018 11:20:06 -0400 Subject: [PATCH 3/5] Update travis config so Dart 1.0 builds use latest of Dart 1.0 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8f3b43d..d143cdd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: dart dart: -- stable +- "1.24.3" dart_task: - dartanalyzer From 8c8f24026089653be462444848047a4364eb1ffa Mon Sep 17 00:00:00 2001 From: Stargator Date: Fri, 23 Nov 2018 15:31:53 -0500 Subject: [PATCH 4/5] Implement support of ContentType and InternetAddress constant variables * Generator learns how to process static final variables --- lib/io.dart | 14 ++++++++++++++ tool/generate.dart | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/lib/io.dart b/lib/io.dart index 83020a8..b070534 100644 --- a/lib/io.dart +++ b/lib/io.dart @@ -158,6 +158,13 @@ abstract class HttpHeaders { static const requestHeadersHeader = io.HttpHeaders.REQUEST_HEADERS; } +abstract class ContentType { + static final binary = io.ContentType.BINARY; + static final html = io.ContentType.HTML; + static final json = io.ContentType.JSON; + static final text = io.ContentType.TEXT; +} + abstract class HttpClient { static const defaultHttpPort = io.HttpClient.DEFAULT_HTTP_PORT; static const defaultHttpsPort = io.HttpClient.DEFAULT_HTTPS_PORT; @@ -201,6 +208,13 @@ abstract class InternetAddressType { static const any = io.InternetAddressType.ANY; } +abstract class InternetAddress { + static final anyIPv4 = io.InternetAddress.ANY_IP_V4; + static final anyIPv6 = io.InternetAddress.ANY_IP_V6; + static final loopbackIPv4 = io.InternetAddress.LOOPBACK_IP_V4; + static final loopbackIPv6 = io.InternetAddress.LOOPBACK_IP_V6; +} + abstract class SocketDirection { static const receive = io.SocketDirection.RECEIVE; static const send = io.SocketDirection.SEND; diff --git a/tool/generate.dart b/tool/generate.dart index e75c18b..cb45615 100644 --- a/tool/generate.dart +++ b/tool/generate.dart @@ -76,10 +76,15 @@ void main(List args) { var constants = type.fields.where((field) => field.isStatic && _isCapsConstant(field)).toList(); - if (constants.isEmpty) continue; + var staticCaps = type.fields.where((field) => _getStaticCapFields(field)).toList(); + + if (constants.isEmpty && staticCaps.isEmpty) continue; buffer.writeln("abstract class ${type.displayName} {"); + _writeOutConstants(constants, type, buffer, name, generateDart1, dart2Type); + _writeOutStaticCaps(staticCaps, type, buffer, name, generateDart1, dart2Library); + buffer.writeln("}"); } } @@ -148,6 +153,36 @@ bool _isCapsConstant(VariableElement variable) { return true; } +/// Returns whether [variable] is a screaming-caps static variable that should be +/// polyfilled to be camel-case. +bool _isCapsStatic(VariableElement variable) { + if (!variable.isStatic) return false; + if (variable.isConst) return false; + if (_skip.contains(variable.displayName)) return false; + if (!variable.displayName.contains(new RegExp("^[A-Z]"))) return false; + return true; +} + +bool _getStaticCapFields(FieldElement field) { + return _isCapsStatic(field); +} + +void _writeOutStaticCaps(List staticCaps, ClassElement type, StringBuffer buffer, String name, + bool generateDart1, Element dart2Type) { + for (var staticCap in staticCaps) { + var newName = _camelCase(staticCap.displayName); + + var useNewName = !generateDart1 && _find(dart2Type, newName) != null; + if (!useNewName && _find(dart2Type, staticCap.displayName) == null) { + continue; + } + + buffer.write("static final $newName = $name.${staticCap.type}."); + buffer.write(useNewName ? newName : staticCap.displayName); + buffer.writeln(";"); + } +} + void _writeOutConstants(List constants, ClassElement type, StringBuffer buffer, String name, bool generateDart1, Element dart2Type) { for (var constant in constants) { @@ -174,7 +209,11 @@ final _specialCases = { "SQRT1_2": "sqrt1_2", "BIG_ENDIAN": "big", "LITTLE_ENDIAN": "little", - "HOST_ENDIAN": "host" + "HOST_ENDIAN": "host", + "ANY_IP_V4": "anyIPv4", + "ANY_IP_V6": "anyIPv6", + "LOOPBACK_IP_V4": "loopbackIPv4", + "LOOPBACK_IP_V6": "loopbackIPv6" }; /// Converts a screaming-caps string [caps] to camel-case. From 462c9cde8d6f5e62553540c575c4f9a4faf13a9c Mon Sep 17 00:00:00 2001 From: Stargator Date: Fri, 23 Nov 2018 16:01:22 -0500 Subject: [PATCH 5/5] Add 1.0.2 to CHANGELOG --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ae9d35..f8fee39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 1.0.2 + +* Support ContentType constants. +* Support InternetAddress constants. +* Support HttpHeaders constants. +* Update travis to use the latest Dart1 version, 1.24.3. + ## 1.0.1 * Fix the homepage URL.