Skip to content
This repository was archived by the owner on Nov 9, 2018. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
language: dart

dart:
- stable
- "1.24.3"

dart_task:
- dartanalyzer
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
70 changes: 70 additions & 0 deletions lib/io.dart
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,69 @@ 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 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;
Expand Down Expand Up @@ -145,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;
Expand Down
4 changes: 2 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
name: dart2_constant
version: 1.0.1+dart1
version: 1.0.2+dart1
description: A polyfill for Dart 2 constant names.
author: Dart Team <misc@dartlang.org>
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"
Expand Down
87 changes: 66 additions & 21 deletions tool/generate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,10 @@ void main(List<String> 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;

Expand All @@ -69,31 +71,20 @@ void main(List<String> 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();
if (constants.isEmpty) continue;
var constants = type.fields.where((field) => field.isStatic && _isCapsConstant(field)).toList();

var staticCaps = type.fields.where((field) => _getStaticCapFields(field)).toList();

if (constants.isEmpty && staticCaps.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);
_writeOutStaticCaps(staticCaps, type, buffer, name, generateDart1, dart2Library);

buffer.writeln("}");
}
}
Expand Down Expand Up @@ -162,13 +153,67 @@ 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<FieldElement> 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<FieldElement> 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",
"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.
Expand Down